O trabalho cron diário não está em execução

10

Uma rápida visão geral: tenho um script que fará backup diário do meu repositório de código-fonte do SVN em um tarball para esse dia. Eu testei o script e ele funciona muito bem desde que eu o execute como sudo, devido à propriedade do diretório de saída.

Portanto, o problema é que eu quero executar isso diariamente, então coloquei um link para ele no diretório /etc/cron.daily. Aqui está o conteúdo do diretório

thom@spenser:/etc/cron.daily$ ls -l
total 60
-rwxr-xr-x 1 root root   189 2011-09-14 02:21 apport
-rwxr-xr-x 1 root root 15535 2011-10-06 11:30 apt
-rwxr-xr-x 1 root root   314 2011-08-08 16:57 aptitude
lrwxrwxrwx 1 root root    24 2012-02-28 11:05 backup -> /usr/local/bin/backup.sh
-rwxr-xr-x 1 root root   502 2011-06-08 11:48 bsdmainutils
-rwxr-xr-x 1 root root   256 2011-10-06 04:04 dpkg
-rwxr-xr-x 1 root root   372 2011-10-04 16:50 logrotate
-rwxr-xr-x 1 root root  1353 2011-07-27 07:17 man-db
-rwxr-xr-x 1 root root   606 2011-08-17 09:16 mlocate
-rwxr-xr-x 1 root root   249 2011-06-24 05:36 passwd
-rwxr-xr-x 1 root root  2417 2011-07-01 17:25 popularity-contest
-rwxr-xr-x 1 root root   383 2011-09-30 15:09 samba
-rwxr-xr-x 1 root root  3594 2011-09-19 20:07 standard
thom@spenser:/etc/cron.daily$ 

O problema é que ele simplesmente nunca é executado. Aqui estão as permissões para esse script:

thom@spenser:/etc/cron.daily$ ls -l /usr/local/bin/backup.sh 
-rwxr-xr-x 1 root root 260 2012-02-28 11:03 /usr/local/bin/backup.sh

Ideias?

Thom
fonte
2
Se possível, considere fechar algumas de suas outras perguntas em aberto selecionando a melhor resposta (se houver). Precisamos que os usuários mantenham suas perguntas para que o site possa ser uma ferramenta eficaz para a próxima pessoa com seus problemas. Para mais detalhes sobre as melhores práticas, considere a leitura das perguntas frequentes sobre perguntas .
Bruno Pereira

Respostas:

37

Tentei isso

run-parts --test /etc/cron.daily

Achei que o meu arquivo update.ubuntu não apareceu. Também notei que meu arquivo tinha uma extensão (possui um ponto).

Passos para corrigir isso.

  1. Renomeei meu update.ubuntu para update-ubuntu
  2. Agora run-parts --test /etc/cron.daily, novamente , desta vez, meu arquivo apareceu!
D Durga Prasad
fonte
1
Sim, isso corrigiu para mim. Não gosta de pontos no nome do arquivo, renomear meu arquivo de myscript.sh para myscript funcionou para mim.
precisa
3
Isso precisa ser maior. Meu script foi salvo como o "backup.sh" tradicional. A remoção da parte ".sh" resolveu o problema. Muito obrigado!
David
Obrigado! O cara / garota que decidiu remover implicitamente arquivos .sh do cron diário deve ter vergonha!
Sylvain
Deve ser açoitado publicamente! ;-) Gostaria de saber quanto tempo as pessoas perderam coletivamente por causa dessa decisão ... Também me pergunto se havia uma boa razão para isso?
Xastor #
3

Pode ser uma das várias coisas:

Caminho de raízes:

Dependendo dos comandos que estão sendo executados, pode ser necessário expandir a variável PATH dos usuários root colocando a seguinte linha na parte superior do arquivo crontab:

PATH = / usr / sbin: / usr / bin: / sbin: / bin

src: https://help.ubuntu.com/community/CronHowto

Ou apenas use caminhos completos para cada comando no seu script: em /bin/lsvez de lspor exemplo. ( which lsna linha de comando para caminhos).

Há um bug estranho sobre pontos no nome do arquivo relatado aqui . Pode estender-se ao arquivo ao qual você está vinculando, embora isso pareça improvável.

Você está salvando a saída do arquivo de backup? Coloque algo assim na primeira linha, para ajudar a determinar se não está funcionando ou está funcionando, mas está falhando em algum momento.

/bin/echo "Attempting to run backup" >> /path-to-home/backup.log

Como alternativa, tente adicionar o script ao arquivo crontab diretamente:

sudo -i
crontab -e
[add the next line to the file, then save and exit]
33 15 * * * /usr/local/bin/backup.sh

será executado às 15:30 todos os dias se a máquina estiver ligada. use * * * * * durante o teste para executar uma vez por minuto até que funcione.

Sean
fonte
1
Usar caminhos absolutos em scripts é desencorajado. Se você não souber o que é PATH, configure-o no script. Veja Razões pelas quais crontab não trabalho
geirha
Link útil, obrigado. A razão dada para não usar caminhos completos é a portabilidade. Justo. Outra solução razoável é definir os comandos que você está usando no início do script, juntamente com outras configurações: LS = / bin / ls; SRC_DIR = / home / joe / src. Em seguida, use $ LS $ SRC_DIR. Mantém tudo definido no topo e em um só lugar.
31512 Sean
Acho que isso reduz a legibilidade e você precisa revisar todos os comandos = / path / to / para cada novo sistema em que ele deve ser executado. Em um sistema, todos os comandos que você precisa podem estar em / usr / bin, em outros, alguns em / bin, outros em / usr / bin. Ter ambos / usr / bin e / bin no PATH torna isso um problema. Em uma nota lateral, os nomes das variáveis ​​devem estar em minúsculas, caso contrário, você corre o risco de substituir variáveis ​​especiais do shell ou variáveis ​​de ambiente.
geirha
re: nomes de variáveis ​​em maiúsculas. Eu sempre fiz isso sem pensar muito, devido aos primeiros scripts que vi fazendo isso. Mas você está certo, não há vantagens e chances de desvantagens. Obrigado por apontar isso, quebrando esse hábito agora.
21412 Sean
1

Grep seu syslog para mensagens como;

crond: (*system*) BAD FILE MODE

os arquivos precisam ser restritos a (é suficiente) em 644):

chmod 0644 /etc/cron.d/my_crontab
Tom H
fonte