Posso usar o cron para tocar alto como um relógio de ponto?

8

Eu me perco no askubuntu lendo Q&A e experimentando trechos de código recomendados. Por isso, muitas vezes sinto falta de mudar de canal de notícias na TV na hora da hora. Não é um grande problema para os canais do youtube que permitem a mudança de tempo, mas é uma "interrupção do programa" para canais de TV usando o flash player.

Pode cronser configurado para executar um trabalho no topo de cada hora em que forneço um script para soar um avô como um toque de relógio (com volume de som sutil, é claro!)? Um pequeno sinal sonoro também pode ser emitido no final da hora. Tenho certeza de que posso localizar arquivos .oggou adequados .ogana rede e sei que posso usá ogg123-los para reproduzi-los. Só não sei se cronpoderia fazê-lo. Eu sei que eu poderia usar um script que dorme e acorda para testar o tempo, mas não gosta do pensamento de ter algo em execução o tempo todo (há bastante disso acontecendo, eu acho).

Se isso puder ser feito, cronalguém pode responder como configurá-lo?

Obrigado.

WinEunuuchs2Unix
fonte
Eu não sou muito bom em idiomas ingleses. topo de cada hora, o que significa início de cada hora?
precisa saber é o seguinte
1
@heemayl LOL sim. Eu venho de uma época em que os relógios digitais foram inventados e houve um ponteiro de minutos que quando "no topo" significava: 00 horas e quando "no fundo" significava: 30 horas. Hehe
WinEunuuchs2Unix 1/16/16
sudo apt-get install mcron - stackoverflow.com/questions/44470965/...
SDsolar
@SDsolar, este parece ser um substituto cronque está além do escopo da pergunta. Para sua informação, escrevi o script do relógio do avô na resposta abaixo.
WinEunuuchs2Unix

Respostas:

7

Sim você pode.

Abra sua cronmesa com crontab -ee adicione:

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

Substitua /path/to/playere /path/to/file.oggpelos respectivos valores desejados.

O item acima reproduz o som (ou seja, executa o comando), a cada hora no 00-ésimo (início do primeiro) minuto.

Se você deseja executar o comando também no 30décimo minuto de cada hora:

00,30 * * * * /path/to/player /path/to/file.ogg
heemail
fonte
Ao digitar crontab -e, diz que não há arquivo criado para minha conta de usuário. Oferece para criar um com nano. Eu fiz isso e configurei os comandos sugeridos. Ao selecionar ^W(arquivo de gravação) o nome do arquivo padrão é: /tmp/crontab.6QN0vo/crontab. O nome do arquivo parece muito errado. Você pode atualizar sua resposta para criar um novo crontab -earquivo de configuração? Observe que meu sistema já está configurado para excluir /tmp/IG*arquivos com mais de um dia de funcionamento e que estão funcionando bem (eu simplesmente não me lembro de como montei esse filhote).
WinEunuuchs2Unix 01/10/19
@ WinEunuuchs2Unix Não se preocupe, cronabre esse arquivo temporariamente /tmp, depois de salvar o conteúdo, criar / substituir o arquivo /var/spool/cron/crontabs/<username>e isso é permanente.
Hemayl # 1/16
6

heemayl forneceu a resposta correta para começar crona correr na parte superior e inferior da hora. Obrigado novamente! No entanto, como outros usuários descobriram, cronjobnão é possível reproduzir arquivos de som por padrão:


Configurando cronpara reproduzir sons

Para cronreproduzir arquivos de som, ele precisa de exportuma variável de ambiente:

export XDG_RUNTIME_DIR="/run/user/1000"

Uma vez feito isso no seu script, os sons serão reproduzidos.

Como apontado por outra resposta seu ID de usuário nem sempre pode ser 1000. Para encontrar seu ID de usuário, 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)

Se o seu ID do usuário não for 1000, altere o script para o seu ID.

Configure cronpara executar a parte superior da hora e a parte inferior da hora

crontab -e configuração (apenas nas últimas 5 linhas):

# 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

A maioria dos usuários configuram cronpara usar onano editor. Use estas teclas de controle nanopara salvar seu trabalho:

  • Adicione as duas últimas linhas acima e use Ctrl+ Opara escrever O ut (salvar) o arquivo.
  • Um /tmp...nome de arquivo é apresentado, mas não se preocupe, basta pressionar Enter.
  • Agora use Ctrl+ Xpara e X o nanoeditor.

O bottom-of-hour-chimescript é executado na parte superior da hora também, mas tudo bem, pois é curto e agradável.

Se você não tiver o >/dev/nullno final das linhas, crontente enviar um email com a saída do comando. Se você não tiver o servidor de email configurado, uma mensagem de erro será exibida no seu /var/log/syslogarquivo:

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

Configurando cron para exibir notificações pop-up

O script exibe uma mensagem de notificação pop-up na parte superior de cada hora. Portanto, para isso, uma variável adicional precisa ser exportada:

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

Conteúdo 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%

o export XDG_RUNTIME_DIR... é necessário para obter o som para o jogo. Isso ocorre porque é cronexecutado em ambiente mínimo. Essa linha deve ser omitida primeiro se você usar um reprodutor de som de terceiros. Se não houver som, coloque a linha de volta. Ainda assim, se não houver som, caça feliz!

Os dois principais noticiários de TV que eu assisto na Internet têm um volume mais baixo que o normal e, portanto, a TV aumentou mais que o normal. Consequentemente, quandoogg123 reproduz arquivos de som, eles soam muito altos. Então pactlé usado para reduzir o volume antes do carrilhão e aumentá-lo depois.

Conteúdo do carrilhão da parte inferior da hora

Isso é quase uma duplicata top-of-hour-chimee talvez redundante aqui, mas incluído para fins de documentação 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
fonte
1

Apesar de usar esta exportação:

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

não funcionou.

Após meses de pesquisa, não encontrou solução.

Em desespero, tentei o seguinte e funcionou:

Digite o seguinte em 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

Próximo criar .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 isto ajude.

ColinWa
fonte