Puis-je utiliser cron pour sonner en haut de l'heure comme une horloge de grand-père?

8

Je me perds dans askubuntu en lisant les questions / réponses et en expérimentant les extraits de code recommandés. Donc, je manque souvent de changer de chaîne d'actualités télévisées sur Internet en haut de l'heure. Ce n'est pas un gros problème pour les chaînes youtube qui permettent le décalage temporel, mais c'est un "show stopper" pour les chaînes de télévision utilisant un lecteur flash.

Peut cronêtre configuré pour exécuter un travail en haut de chaque heure où je fournis un script pour faire sonner un grand-père comme un carillon d'horloge (avec un volume sonore subtil bien sûr!)? Un carillon mineur pourrait également retentir au bas de l'heure. Je suis sûr que je peux trouver approprié .oggou des .ogafichiers sur le net et je sais que je peux utiliser ogg123pour les lire. Je ne sais juste pas si cronje pourrais le faire. Je sais que je pourrais utiliser un script qui dort et se réveille pour tester le temps, mais je n'aime pas l'idée d'avoir quelque chose qui tourne tout le temps (il y en a déjà assez, je pense).

Si cela peut être fait, cronquelqu'un peut-il répondre à la configuration?

Je vous remercie.

WinEunuuchs2Unix
la source
Je ne suis pas très doué pour les idiomes anglais. en haut de chaque heure, ce qui signifie le début de chaque heure?
heemayl
1
@heemayl LOL oui. Je viens d'une époque où les horloges numériques n'ont pas été inventées et il y avait une aiguille des minutes qui signifiait: "en haut": 00 heure et en "bas": 30 heure. Hehe
WinEunuuchs2Unix
sudo apt-get install mcron - stackoverflow.com/questions/44470965/…
SDsolar
@SDsolar, cela semble être un remplacement cronqui dépasse la portée de la question. Pour info j'ai écrit le script d'horloge grand-père dans la réponse ci-dessous.
WinEunuuchs2Unix

Réponses:

7

Oui, vous pouvez.

Ouvrez votre crontable avec crontab -eet ajoutez:

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

Remplacez /path/to/playeret /path/to/file.oggpar les valeurs respectives que vous souhaitez.

Ce qui précède jouera le son (c.-à-d. Exécutez la commande), à ​​toutes les heures à 00-th (début de la première) minute.

Si vous souhaitez également exécuter la commande à la 30-ième minute de chaque heure:

00,30 * * * * /path/to/player /path/to/file.ogg
heemayl
la source
Lors de la saisie, crontab -eil est indiqué qu'aucun fichier n'a été créé pour mon compte d'utilisateur. Il propose d'en créer un avec nano. Je l'ai fait et mis en place les commandes suggérées. Lors de la sélection ^W(fichier d'écriture) le nom de fichier par défaut est: /tmp/crontab.6QN0vo/crontab. Le nom du fichier semble très faux. Pouvez-vous mettre à jour votre réponse pour créer un nouveau crontab -efichier de configuration? Notez que mon système est déjà configuré pour supprimer des /tmp/IG*fichiers de plus d'un jour qui fonctionnent bien (je ne me souviens tout simplement pas comment j'ai configuré ce chiot).
WinEunuuchs2Unix
@ WinEunuuchs2Unix Ne vous inquiétez pas, cronouvre ce fichier temporairement dans /tmp, une fois que vous avez enregistré le contenu, créera / remplacera le fichier /var/spool/cron/crontabs/<username>, et c'est permanent.
heemayl
6

heemayl a fourni la bonne réponse pour croncourir en haut et en bas de l'heure. Merci encore! Cependant, comme d'autres utilisateurs ont découvert cronjobqu'il ne peut pas lire les fichiers audio par défaut:


Configuration cronpour jouer des sons

Pour cronlire des fichiers audio, il a besoin d' exportune variable d'environnement:

export XDG_RUNTIME_DIR="/run/user/1000"

Une fois cela fait dans votre script, les sons seront joués.

Comme indiqué par une autre réponse, votre ID utilisateur ne l'est pas toujours 1000. Pour trouver votre ID utilisateur, utilisez:

$ 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 votre ID utilisateur n'est pas 1000, modifiez le script en votre ID.

Configurer cronpour exécuter en haut et en bas de l'heure

crontab -e configuration (5 dernières lignes uniquement):

# 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 plupart des utilisateurs se configurent cronpour utiliser l' nanoéditeur. Utilisez ces touches de contrôle nanopour enregistrer votre travail:

  • Ajoutez les deux dernières lignes ci-dessus et utilisez Ctrl+ Opour écrire O ut (enregistrer) le fichier.
  • Un /tmp...nom de fichier est présenté, mais ne vous inquiétez pas, appuyez simplement sur Enter.
  • Maintenant, utilisez Ctrl+ Xpour e X it l' nanoéditeur.

Le bottom-of-hour-chimescript s'exécute également en haut de l'heure, mais c'est OK car il est court et doux.

Si vous n'avez pas le >/dev/nullà la fin des lignes, cronessayez de vous envoyer un e-mail avec la sortie de la commande. Si vous n'avez pas la configuration du serveur de messagerie, un message d'erreur apparaît dans votre /var/log/syslogfichier:

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

Configuration cronpour afficher des notifications contextuelles

Le script affiche un message de notification contextuel en haut de chaque heure. Donc, pour cela, une variable supplémentaire doit être exportée:

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

Contenu 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%

Il export XDG_RUNTIME_DIR...est nécessaire de faire jouer le son. En effet, crons'exécute dans un environnement minimal. Cette ligne doit être supprimée en premier si vous utilisez un lecteur audio tiers. Ensuite, si aucun son ne remet la ligne. Alors quand même pas de son, bonne chasse bien!

Les deux principales émissions télévisées que je regarde sur le net ont un volume plus doux que la normale, j'ai donc le téléviseur tourné plus haut que la normale. Par conséquent, lors de la ogg123lecture de fichiers audio, ils sonnent très fort. Il pactlest donc utilisé pour réduire le volume avant le carillon et l'augmenter ensuite.

Contenu du carillon de fin d'heure

C'est presque un doublon top-of-hour-chimeet peut-être redondant ici, mais inclus à des fins de documentation complète.

#! /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
la source
1

Malgré l'utilisation de cette exportation:

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

ça n'a pas marché.

Après des mois de recherche, aucune solution n'a été trouvée.

En désespoir de cause, a essayé ce qui suit et cela a fonctionné:

Entrez ce qui suit dans 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

Créer ensuite .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"

J'espère que cela t'aides.

ColinWa
la source