Czy mogę używać crona do dzwonienia w godzinach szczytu jak zegar dziadka?

8

Gubię się w czytaniu pytań i odpowiedzi w pytubuntu i eksperymentowaniu z zalecanymi fragmentami kodu. Dlatego często brakuje mi kanałów telewizyjnych w Internecie w szczycie godziny. Nie jest to duży problem dla kanałów YouTube, które umożliwiają przesunięcie czasowe, ale jest to „zatrzymanie pokazu” dla kanałów telewizyjnych korzystających z odtwarzacza Flash.

Czy cronmożna skonfigurować uruchamianie zadania na początku każdej godziny, w którym udostępniam skrypt dźwiękowy dziadka podobny do gongu zegarowego (z subtelną głośnością!)? Drobny dzwonek może również zabrzmieć w dolnej części godziny. Jestem pewien, że mogę znaleźć odpowiednie pliki .ogglub .ogapliki w sieci i wiem, że mogę ogg123ich odtwarzać. Po prostu nie wiem, czy cronmógłbym to zrobić. Wiem, że mógłbym użyć skryptu, który śpi i budzi się, aby sprawdzić czas, ale nie podoba mi się myśl, że coś działa cały czas (myślę, że już wystarczająco dużo tego trwa).

Jeśli można to zrobić, cronczy ktoś może odpowiedzieć, jak to skonfigurować?

Dziękuję Ci.

WinEunuuchs2Unix
źródło
Nie jestem zbyt dobry w angielskich idiomach. początek każdej godziny, co oznacza początek każdej godziny?
heemayl
1
@heemayl LOL tak. Pochodzę z czasów przed wynalezieniem zegarów cyfrowych i była minutowa wskazówka, która na „górze” oznaczała: 00 godziny, a na „dole”: 30 godziny. Hehe
WinEunuuchs2Unix
sudo apt-get install mcron - stackoverflow.com/questions/44470965/…
SDsolar
@SDsolar wydaje się, że jest to zamiennik, cronktórego wykracza poza zakres pytania. Do Twojej wiadomości napisałem skrypt zegara dziadka w odpowiedzi poniżej.
WinEunuuchs2Unix

Odpowiedzi:

7

Tak, możesz.

Otwórz swój cronstół za pomocą crontab -ei dodaj:

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

Zastąp /path/to/playeri /path/to/file.oggodpowiednimi wartościami, które chcesz.

Powyższe odtworzy dźwięk (tj. Uruchom polecenie), o każdej godzinie w 00-tej (początku pierwszej) minucie.

Jeśli chcesz uruchomić polecenie również w- 30minucie minut każdej godziny:

00,30 * * * * /path/to/player /path/to/file.ogg
heemayl
źródło
Podczas pisania crontab -enapisano, że nie ma pliku utworzonego dla mojego konta użytkownika. Oferuje utworzenie z nim nano. Zrobiłem to i skonfigurowałem sugerowane polecenia. Przy wyborze ^W(plik zapisu) domyślna nazwa pliku to: /tmp/crontab.6QN0vo/crontab. Nazwa pliku wydaje się bardzo błędna. Czy potrafisz zaktualizować swoją odpowiedź dotyczącą utworzenia nowego crontab -epliku konfiguracyjnego? Zauważ, że mój system jest już skonfigurowany do usuwania /tmp/IG*plików w ciągu jednego dnia, co działało dobrze (po prostu nie pamiętam, jak skonfigurowałem tego szczeniaka).
WinEunuuchs2Unix
@ WinEunuuchs2Unix Nie martw się, cronotwiera ten plik tymczasowo /tmp, po zapisaniu zawartości utworzy / zastąpi plik /var/spool/cron/crontabs/<username>, i to na stałe.
heemayl
6

heemayl podał poprawną odpowiedź, aby rozpocząć cronbieg na górze i na dole godziny. Dzięki jeszcze raz! Jednak gdy inni użytkownicy odkryli, że cronjobdomyślnie nie można odtwarzać plików dźwiękowych:


Konfiguracja cronodtwarzania dźwięków

Aby cronodtwarzać pliki dźwiękowe, wymagana exportjest zmienna środowiskowa:

export XDG_RUNTIME_DIR="/run/user/1000"

Po wykonaniu tego w skrypcie odtwarzane będą dźwięki.

Jak wskazano inną odpowiedź Twój identyfikator użytkownika nie zawsze może być 1000. Aby znaleźć swój identyfikator użytkownika, użyj:

$ id

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

Jeśli identyfikator użytkownika nie jest 1000, zmień skrypt na swój identyfikator.

Skonfiguruj tak, cronaby działał na początku i na końcu godziny

crontab -e setup (tylko ostatnie 5 linii):

# 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

Większość użytkowników cronkorzysta z nanoedytora. Użyj tych klawiszy kontrolnych, nanoaby zapisać swoją pracę:

  • Dodaj dwa ostatnie wiersze powyżej i użyj Ctrl+, Oaby zapisać O ut (zapisz) plik.
  • Nazwa /tmp...pliku jest wyświetlana, ale nie martw się, po prostu naciśnij Enter.
  • Teraz użyj Ctrl+, Xaby e X to nanoedytor.

W bottom-of-hour-chimebiegnie skrypt na górze godzinę też, ale, to jest OK, ponieważ jest to krótkie i słodkie.

Jeśli nie masz >/dev/nullna końcu linii, cronspróbuje wysłać Ci wiadomość e-mail z wynikiem polecenia. Jeśli nie masz skonfigurowanego serwera pocztowego, w /var/log/syslogpliku pojawi się komunikat o błędzie :

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

Konfigurowanie crondo wyświetlania wyskakujących powiadomień

Skrypt wyświetla wyskakujące powiadomienie u góry każdej godziny. W tym celu należy wyeksportować dodatkową zmienną:

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

Zawartość 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%

Konieczne export XDG_RUNTIME_DIR...jest, aby dźwięk był odtwarzany. Wynika to z faktu, że crondziała w minimalnym środowisku. Ten wiersz należy najpierw pominąć, jeśli używasz odtwarzacza dźwięku innej firmy. Jeśli brak dźwięku, odłóż linię z powrotem. Więc nadal, jeśli nie ma dźwięku, dobrze szczęśliwy polowanie!

Dwa główne programy telewizyjne, które oglądam w sieci, mają cichszy niż zwykle poziom głośności, więc mam telewizor wyższy niż normalnie. W konsekwencji podczas ogg123odtwarzania plików dźwiękowych brzmią one bardzo głośno. pactlSłuży więc do zmniejszania głośności przed dzwonkiem i zwiększania jej później.

Zawartość gongu z dołu godziny

Jest to prawie duplikat top-of-hour-chimei być może zbędny tutaj, ale dołączony do pełnej dokumentacji.

#! /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
źródło
1

Pomimo korzystania z tego eksportu:

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

to nie działało.

Po miesiącach badań nie znaleziono rozwiązania.

W desperacji wypróbowałem następujące i zadziałało:

Wpisz następujące informacje w kontakcie

# 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

Następnie utwórz .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"

Mam nadzieję że to pomoże.

ColinWa
źródło