¿Puedo usar cron para hacer sonar la hora como un reloj de pared?

8

Me pierdo en askubuntu leyendo preguntas y respuestas y experimentando con fragmentos de código recomendados. Por lo tanto, a menudo echo de menos cambiar los canales de noticias de TV en Internet en el último momento. No es un gran problema para los canales de YouTube que permiten el cambio de tiempo, pero es un "show stopper" para los canales de televisión que usan flash player.

¿Se cronpuede configurar para ejecutar un trabajo en la parte superior de cada hora donde proporciono un script para hacer sonar a un abuelo como la campanilla del reloj (con un volumen de sonido sutil, por supuesto)? También podría sonar una campanilla menor al final de la hora. Estoy seguro de que puedo encontrar archivos adecuados .oggo .ogaen la red y sé que puedo usarlos ogg123para reproducirlos. Simplemente no sé si cronpodría hacerlo. Sé que podría usar un script que duerma y se despierte al tiempo de prueba, pero no me gusta la idea de tener algo ejecutándose todo el tiempo (creo que ya hay suficiente de eso pasando).

Si se puede hacer esto, cron¿alguien puede responder cómo configurarlo?

Gracias.

WinEunuuchs2Unix
fuente
No soy muy bueno con los modismos ingleses. la parte superior de cada hora significa el inicio de cada hora?
heemayl
1
@heemayl LOL sí. Vengo de una época anterior a la invención de los relojes digitales y había un minutero que cuando en "arriba" significaba: 00 de la hora y cuando en "abajo" significaba: 30 de la hora. Jeje
WinEunuuchs2Unix
sudo apt-get install mcron - stackoverflow.com/questions/44470965/…
SDsolar
@SDsolar esto parece ser un reemplazo cronque está más allá del alcance de la pregunta. FYI He escrito el guión del reloj de pie en la respuesta a continuación.
WinEunuuchs2Unix

Respuestas:

7

Sí tu puedes.

Abra su cronmesa con crontab -ey agregue:

00 * * * * /path/to/player /path/to/file.ogg

Reemplace /path/to/player, y /path/to/file.oggcon los valores respectivos que desee.

Lo anterior reproducirá el sonido (es decir, ejecutará el comando), cada hora a la 00enésima (inicio del primer) minuto.

Si desea ejecutar el comando en el 30minuto número de cada hora también:

00,30 * * * * /path/to/player /path/to/file.ogg
heemayl
fuente
Al escribir crontab -e, dice que no hay un archivo creado para mi cuenta de usuario. Ofrece crear uno con nano. Hice esto y configuré los comandos sugeridos. Al seleccionar ^W(archivo de escritura) el nombre de archivo por defecto es: /tmp/crontab.6QN0vo/crontab. El nombre del archivo parece muy incorrecto. ¿Puedes actualizar tu respuesta para crear un nuevo crontab -earchivo de configuración? Tenga en cuenta que mi sistema ya está configurado para eliminar /tmp/IG*archivos de más de un día de antigüedad, lo que ha estado funcionando bien (simplemente no recuerdo cómo configuré ese cachorro).
WinEunuuchs2Unix
@ WinEunuuchs2Unix No se preocupe, cronabre ese archivo temporalmente /tmp, una vez que guarde el contenido, creará / reemplazará el archivo /var/spool/cron/crontabs/<username>, y eso es permanente.
heemayl
6

heemayl ha proporcionado la respuesta correcta cronpara correr en la parte superior de la hora y la parte inferior de la hora. ¡Gracias de nuevo! Sin embargo, como otros usuarios han descubierto cronjobque no se pueden reproducir archivos de sonido de forma predeterminada:


Configurando cronpara reproducir sonidos

Para cronreproducir archivos de sonido necesita exportuna variable de entorno:

export XDG_RUNTIME_DIR="/run/user/1000"

Una vez hecho esto en su guión, se reproducirán los sonidos.

Como se indicó en otra respuesta, su identificación de usuario puede no ser siempre 1000. Para encontrar su ID de usuario use:

$ id

uid=1000(rick) gid=1000(rick) groups=1000(rick),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)

Si su ID de usuario no es 1000, cambie la secuencia de comandos a su ID.

Configurar cronpara ejecutar la parte superior de la hora y la parte inferior de la hora

crontab -e configuración (solo las últimas 5 líneas):

# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
00 *    *   *   *    /usr/local/bin/top-of-hour-chime    >/dev/null
00,30 * *   *   *    /usr/local/bin/bottom-of-hour-chime >/dev/null

La mayoría de los usuarios configuran cronpara usar el nanoeditor. Use estas teclas de control nanopara guardar su trabajo:

  • Agregue las dos últimas líneas anteriores y use Ctrl+ Opara escribir O ut (guardar) el archivo.
  • Se /tmp...presenta un nombre de archivo, pero no se preocupe, simplemente presione Enter.
  • Ahora use Ctrl+ Xpara e X es el nanoeditor.

El bottom-of-hour-chimescript también se ejecuta en la parte superior de la hora, pero eso está bien, ya que es breve y dulce.

Si no tiene el >/dev/nullfinal de las líneas, cronintenta enviarle un correo electrónico con la salida del comando. Si no tiene el servidor de correo configurado, aparecerá un mensaje de error en su /var/log/syslogarchivo:

Oct 02 10:00:07 dell CRON[21259]: (CRON) info (No MTA installed, discarding output)

Configuración cronpara mostrar notificaciones emergentes

El script muestra un mensaje de notificación emergente en la parte superior de cada hora. Entonces, para esto, se debe exportar una variable adicional:

eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";

Contenido de top-of-hour-chime

#! /bin/bash

# NAME: top-of-hour-chime
# PATH: /usr/local/bin
# DESC: Play sound called by cron
# CALL: Automatically called by /var/spool/cron/crontabs/<user_name>
# DATE: Created Oct 1, 2016. Modified June 10, 2018.
# UPDT: 2016-11-09 - Add notification bubble with time in text.
#       2018-06-10 - Switch from `ogg123` to `paplay` in default installation.

# exit # uncomment to suppress when watching movies

# paplay needs environment variable exported:
export XDG_RUNTIME_DIR="/run/user/1000"

# needed for notify-send
eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ)";

# get hour in 12 hour format
HOUR=$(date +%I)
ZHOUR=$(echo $HOUR | sed 's/^0*//')

pactl set-sink-volume 0 -25%
DISPLAY=:0 notify-send --urgency=critical --icon=/usr/share/icons/gnome/256x256/status/appointment-soon.png "It is ""$ZHOUR"" o'clock"
paplay '/usr/share/sounds/ubuntu/ringtones/Melody piano.ogg'
pactl set-sink-volume 0 +25%

El export XDG_RUNTIME_DIR...es necesario para obtener sonido para jugar. Esto se debe a que se cronejecuta en un entorno mínimo. Esta línea debe omitirse primero si utiliza un reproductor de sonido de terceros. Entonces, si no hay sonido, vuelva a poner la línea. Entonces aún si no hay sonido, ¡feliz caza!

Los dos programas principales de noticias de TV que miro en la red tienen un volumen más bajo de lo normal, por lo que tengo el televisor más alto de lo normal. En consecuencia, cuando ogg123reproduce archivos de sonido, suenan muy alto. Por pactllo tanto, se utiliza para reducir el volumen antes de la campana y aumentarlo después.

Contenido del timbre al final de la hora

Esto es casi un duplicado top-of-hour-chimey quizás redundante aquí, pero se incluye con fines de documentación completa.

#! /bin/bash

# NAME: bottom-of-hour-chime
# PATH: /usr/local/bin
# DESC: Play sound called by cron
# CALL: Automatically called by /var/spool/cron/crontabs/<user_name>
# DATE: Oct 1, 2016. Modified June 10, 2018.

# UPDT: 2018-06-10 Switch from `ogg123` to `paplay` installed by default.

# exit # Uncomment to suppress when watching movies.

# paplay needs environment variable exported:
export XDG_RUNTIME_DIR="/run/user/1000"

pactl set-sink-volume 0 -25%
paplay /usr/share/sounds/ubuntu/ringtones/Bliss.ogg
pactl set-sink-volume 0 +25%
WinEunuuchs2Unix
fuente
1

A pesar de usar esta exportación:

# paplay needs environment variable exported:
export XDG_RUNTIME_DIR="/run/user/1000"

No funcionó.

Después de meses de investigación no encontró solución.

En su desesperación, probé lo siguiente y funcionó:

Ingrese lo siguiente en contab

# Terminal command: crontab -e
# Detect the name of the display in use
display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
user=$(who | grep '('$display')' | awk '{print $1}') # the user of the display 
uid=$(id -u $user) #Detect the id of the user

XDG_RUNTIME_DIR=/run/user/${uid}

*/5 * * * * sh /root/.play_sound.sh

Siguiente crear .play_sound.sh

/root/.play_sound.sh

display=":$(ls /tmp/.X11-unix/* | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
user=$(who | grep '('$display')' | awk '{print $1}') # the user of the display 
uid=$(id -u $user) #Detect the id of the user

su - $user -c "paplay /usr/share/sounds/freedesktop/stereo/complete.oga"

Espero que esto ayude.

ColinWa
fuente