Por que colocar um script em /etc/cron.hourly não está funcionando?

16

Coloquei um script executável /etc/cron.hourly, mas esse script não era executado a cada hora, na verdade, nunca é executado.

Aqui está o script (som da hora) que eu fiz:

#! / bin / bash
mplayer ~ / Música / sfx_msg-destaque.wv &> / dev / null &
spd-say -r -50 -p 50 -t male3 "A hora é agora $ (data +"% l% p ")"
notifique-envie "It's:" "$ (date +"% l% p ") agora." -i ~ / Imagens / "first tee.png" -t 5000

Meu crontab é:

DISPLAY=":0.0"
XAUTHORITY="/home/naruto/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"

0 * * * * /home/naruto/Hour-sound.sh

Enquanto os comandos mplayere spd-saysão executados corretamente, o notify-sendnão é. Eu também tentei redirecionar o erro para um arquivo:

0 * * * * /home/naruto/Hour-sound.sh 2>/tmp/error

Mas isso não mostrou resultado. O que estou fazendo de errado?

Bloco preto
fonte
apenas certificando-se de que você executou o script? possuído pela raiz? o que acontece quando você executa o script do terminal ou coloca um script simples lá? Does /etc/crontabtem a run-partslinha para a execução de hora em hora cronempregos a partir do diretório?
amigos estão dizendo sobre heemayl
Executável: sim, a execução do script não corre nada errado no diretório /etc/cron.hourly, não sabe como verificar isso? Está nos aplicativos de inicialização? @heemayl
Black Block
1
O /etc/crontabarquivo tem a linha 17 * * * * root cd / && run-parts --report /etc/cron.hourly?
amigos estão dizendo sobre heemayl
1
Por favor , não poste capturas de tela de texto . Especialmente quando esse texto é exibido em uma janela de terminal transparente e inclui cores que distraem.
terdon

Respostas:

24

Como você provavelmente já viu nos comentários da sua pergunta, os cronjobs /etc/cron.hourly(e os outros diretórios similares) são executados por run-parts. run-partsé um pouco exigente quanto aos nomes de arquivos. Por padrão, ele não executa arquivos cujos nomes de arquivos contêm nada além de (todos aqueles do ASCII)

  • letras maiúsculas
  • letras minúsculas
  • dígitos
  • sublinhados
  • traços ("sinais de menos")

Portanto, se o seu script tiver um nome de arquivo, por exemplo "myscript.sh", ele será ignorado, porque run-partsnão gosta do ponto.

Henning Kockerbeck
fonte
1- Aqui estão meus arquivos: mediafire.com/view/rg8r85xb7qw26zs/cron.hourly_017.png 2- Você tentou algum script em /etc/cron.hourly e trabalhou com você?
Preto Bloco
2
Acabei de testar um script litte que acabou de escrever "Hello" em um arquivo em / tmp, e funcionou sem problemas. Apenas no caso, você está ciente de que os scripts /etc/cron.hourlynão são necessariamente executados "na hora"? Se o seu cronjob /etc/crontabtiver 17 na posição de minutos, os scripts serão executados às 00:17, 01:17 e assim por diante. E, novamente, por precaução, as permissões do script permitem que o usuário root as execute?
Henning Kockerbeck
Sim, mas esse meu roteiro nunca é executado a qualquer momento. e sobre a permissão, veja aqui: mediafire.com/view/psnb4bflawdlyly/…
Black Block
Talvez seja realmente um problema de permissão. Eu sei que os scripts mais gerais /etc/cron.d/não devem ter permissões de gravação ou execução para "grupo" ou "outros". "owner" precisa executar permissão, "group" e "others" devem ter apenas permissão de leitura. Talvez isso se aplique /etc/cron.hourlytambém, embora eu não tenha testado isso.
Henning Kockerbeck
Ok, então eu mudei a permissão para o meu arquivo mediafire.com/view/s2lq63u7z54ohbo/… que torna o grupo que é o grupo raiz somente leitura e outros, então isso vai causar algum problema?
Black Block
5

Um problema é que você está tentando executar um aplicativo gráfico ( notify-send) no cron. Isso leva um pouco de ajustes. Você precisa definir XAUTHORITYe DISPLAYvariáveis ​​no crontab para que ele possa se conectar à sua sessão X em execução e você precisa definir XDG_RUNTIME_DIRpara que ele possa se conectar à sua sessão do pulseaudio. Infelizmente, eles precisam ser definidos no próprio crontab, para que você não possa usá-lo /etc/cron.hourly. Em vez disso, execute crontab -ee adicione estas linhas:

DISPLAY=":0.0"
XAUTHORITY="/home/YOURUSERNAME/.Xauthority"
XDG_RUNTIME_DIR="/run/user/1000"

0 * * * * /path/to/script.sh 

Altere o valor de XDG_RUNTIME_DIRpara o que for retornado quando você o fizer echoa partir de um terminal. No meu sistema, é o seguinte:

$ echo $XDG_RUNTIME_DIR
/run/user/1001

Provavelmente será o mesmo no seu, mas verifique primeiro. Agora, seu script será executado a cada hora e deve funcionar conforme o esperado.

Terdon
fonte
É isso que você quer dizer com mediafire.com/view/ucjpvu8b41n3hue/… . isso não funcionou para mim.
Preto Bloco
Eu acho que se o problema estava na notificação de envio, por que outro comando não foi executado tão bem (como o mplayer)?
Preto Bloco
@BlackBlock existem vários problemas. i) notify-sendtem o XAUTHORITYe DISPLAYvariáveis a serem definidos e ii) mplayertem a XDG_RUNTIME_DIRser conjunto. Você tentou minha sugestão? Isso deve corrigir os dois problemas. Você provavelmente também teve problemas de nomeação devido aos run-partsexplicados na outra resposta.
terdon
Então por que isso não funcionou para mim? eu vou ficar bravo! veja minha imagem no 1º comentário em sua resposta
Black Block
@BlackBlock no! Você está editando /etc/crontab, não faça isso. Você deseja que isso seja executado como seu usuário, não como root e esse arquivo tem um formato diferente de qualquer maneira. Basta fazer o que eu disse na minha resposta, executar crontab -ee adicionar as linhas lá.
terdon
3

Um script que termina com .shnão é executado na /etc/cron.hourlypasta:

https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=308911
Links ou binários dentro de um diretório manipulado por run-pars (como /etc/cron.daily) não serão executados se um período fizer parte de o nome deles.

renomeie o script

mv /etc/cron.hourly/Hour-sound.sh /etc/cron.hourly/Hour-sound

ou coloque a chamada de script em

/etc/crontab

o que permite o .shfinal

rubo77
fonte
1

Não use script com extensão (abc.sh) e adicione o local necessário. (cron.horas).

adicione seu código ao arquivo abc e salve. (para sua necessidade) (este deve ser o comando bash)

usar

sudo chmod +x abc

comando para criar arquivo executável.

edit etc/cronrtab file

há algumas linhas predefinidas. edite da linha de minutos para horas e salve-a.

então ele funcionará corretamente.

Aruna D Mahagamage
fonte