O @reboot do crontab só funciona para o root?

56

man 5 crontab é bastante claro sobre como usar o crontab para executar um script na inicialização:

   These special time specification "nicknames" are supported, which replace the 5 initial time and date
   fields, and are prefixed by the '@' character:
   @reboot    :    Run once after reboot.

Então, eu felizmente adicionei uma única linha ao meu crontab (sob minha conta de usuário, não como root):

@reboot     /home/me/myscript.sh

Mas por alguma razão, o myscript.sh não rodaria na reinicialização da máquina. (funciona bem se eu invocá-lo a partir da linha de comando, por isso não é um problema de permissões)

O que estou perdendo?

Atualize para responder às perguntas do @ Anthon:

  1. Versão do Oracle-Linux: 5.8 (uname: 2.6.32-300.39.2.el5uek # 1 SMP)
  2. Versão Cron: vixie-cron-4.1-81.el5.x86_64
  3. Sim, /home é uma partição montada. Parece que este é o problema. Como faço para solucionar isso?
  4. Atualmente, myscript.sh apenas exibe uma mensagem de texto em um arquivo em /home/me .
por Withheld 17.01.2014 / 18:56

6 respostas

42

Isso pode ser um pouco confuso porque existem diferentes implementações do cron. Também houve vários bugs que quebraram esse recurso, e há também alguns casos de uso em que simplesmente não funcionará, especificamente se você fizer um shutdown / boot vs. um reboot.

Bugs

datapoint # 1

Um desses problemas no Debian é coberto aqui, intitulado: cron: @reboot jobs não são executados . Isso parece ter entrado no Ubuntu, o que não posso confirmar diretamente.

ponto de dados # 2

A evidência do bug no Ubuntu parece ser confirmada aqui neste SO Q & A intitulado: @ reiniciar o cronjob não está sendo executado .

trecho

comment #1: .... 3) your version of crond may not support @reboot are you using vix's crond? ... show results of crontab -l -u user

comment #2: ... It might be a good idea to set it up as an init script instead of relying on a specific version of cron's @reboot.

comment #3: ... @MarkRoberts removed the reboot and modified the 1 * * * * , to */1 * * * * , problem is solved! Where do I send the rep pts Mark? Thank you!

A resposta aceita em Q & A também teve este comentário:

Seems to me Lubuntu doesn't support the @Reboot Cron syntax.

Evidência adicional

ponto de dados # 3

Como evidência adicional, havia essa discussão de que alguém estava tentando a mesma coisa e ficando frustrada por não ter funcionado. É intitulado: Tópico: Cron - @reboot jobs not working .

trecho

Re: Cron - @reboot jobs not working

Quote Originally Posted by ceallred View Post This is killing me... Tried the wrapper script. Running manually generates the log file... rebooting and the job doesn't run or create log file.

Syslog shows that CRON ran the job... but again, no output and the process isn't running. Jul 15 20:07:45 RavenWing cron[1026]: (CRON) INFO (Running @reboot jobs) Jul 15 20:07:45 RavenWing CRON[1053]: (ceallred) CMD (/home/ceallred/Scripts/run_spideroak.sh > /home/ceallred/Scripts/SpiderOak.log 2>&1 &)

It's seems like cron doesn't like the @reboot command.... Any other ideas?

     

Ok ... Parcialmente resolvido. Vou marcar este como resolvido e começar um novo tópico com o novo problema .....

     

Acho que a resposta foi que meu diretório pessoal criptografado não estava montado quando o CRON estava tentando executar o script (armazenado em / home / username / scripts). Movido para / usr / scripts e a tarefa é executada conforme o esperado.

     

Então, agora parece ser um problema de spideroak. O processo é iniciado, mas quando o processo de inicialização é concluído, ele desaparece. Eu estou supondo uma queda por algum motivo .... Novo tópico para perguntar sobre isso.

     

Obrigado por toda a ajuda!

Uma vez que este usuário acima descobriu seu problema, ele conseguiu fazer com que @reboot trabalhasse na entrada crontab de um usuário.

Não tenho certeza de qual versão do cron é usada no Ubuntu, mas isso parece indicar que o usuário pode usar @reboot também, ou que o bug foi corrigido em algum momento nas versões subseqüentes do cron.

ponto de dados # 4

Eu testei no CentOS 6 o seguinte e funcionou.

Exemplo

$ crontab -l
@reboot echo "hi" > /home/sam/reboot.txt 2>&1

Eu reiniciei o sistema.

$ sudo reboot

Após a reinicialização.

$ cat reboot.txt 
hi

Retire

  1. Esse recurso parece ser suportado para entradas crontab do sistema e do usuário.
  2. Você precisa ter certeza de que é suportado / funcionando em sua distro e / ou versão do pacote cron.

Para saber mais sobre como o mecanismo real funciona para @reboot , encontrei este post do blog que discute as entranhas. É intitulado: @reboot - explicando a mágica simples do cron .

Depuração de crond

Você pode aumentar a verbosidade de crond adicionando o seguinte a este arquivo de configuração em distros baseadas no RHEL / CentOS / Fedora.

$ more crond 
# Settings for the CRON daemon.
# CRONDARGS= :  any extra command-line startup arguments for crond
CRONDARGS="-L 2"

Os níveis válidos são 0, 1 ou 2. Para reverter esse arquivo de volta ao seu nível de registro padrão, simplesmente remova o "-L 2" quando acabar de depurar a situação.

    
por 17.01.2014 / 19:27
10

Descobri que na minha máquina Ubuntu, eu ainda não tenho acesso a serviços de DNS, no momento do @reboot. Isso me impediu de montar volumes remotos. Esta solução simples, mas simples, funcionou:

@reboot sleep 60 && /home/me/bin/mount.sh 2>&1 >> /home/me/reboot.log

(no cron do root; últimas partes apenas para depuração)

    
por 23.03.2016 / 12:24
2

Também tenho mac osx e tive o mesmo problema em que meu script não estava em execução. mas quando eu consertei meu script para gostar

@reboot   cd /home/me/  && sh myscript.sh

funcionou bem para mim. Certifique-se de fazer seu arquivo de shell para ser executável, executando o comando

chmod +x myscript.sh

espero que isso ajude.

    
por 08.02.2017 / 19:16
1

Faça uma nova instalação do Ubuntu Gnome 13.10 (usuário padrão no meu caso: avanderneut).

avanderneut@uggo:~$ crontab -l
no crontab for avanderneut
avanderneut@uggo:~$ crontab -e
no crontab for avanderneut - using an empty one

Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.tiny

Choose 1-3 [2]: 3
crontab: installing new crontab
avanderneut@uggo:~$ crontab -l | tail -2
# m h  dom mon dow   command
@reboot /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ vi /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ more !$
more /home/avanderneut/bin/on_reboot
#! /bin/bash
echo "Reboot script" > /var/tmp/xxx
avanderneut@uggo:~$ chmod 755 /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
avanderneut@uggo:~$ /home/avanderneut/bin/on_reboot
avanderneut@uggo:~$ ls /var/tmp
xxx
avanderneut@uggo:~$ rm /var/tmp/xxx
avanderneut@uggo:~$ sudo reboot
[sudo] password for avanderneut: 

E veja que depois de reiniciar o arquivo /var/tmp/xxx está lá embora ele não esteja lá antes de reinicializar.

Isso foi feito com a versão 3.0 do cron.

Você precisa garantir que nenhum disco de serviços, etc., seja usado e que talvez não esteja disponível no momento em que o script é executado. Comece com algo simples como o descrito acima e verifique se ele não tem saída de terminal, já que o e-mail provavelmente não está funcionando.

Você também pode precisar de um cron mais atualizado (ou um upgrade do oracle-linux) se isso não funcionar para você e você precisar deste recurso.

    
por 18.01.2014 / 06:44
1

Eu não sei se você já resolveu isso, ou se algum dos itens acima foi a solução que você precisava, mas outra possibilidade é:

se você tiver seu diretório / home criptografado, ele pode não estar disponível até você efetuar login, ou seja, ele não estará disponível na reinicialização.

neste cenário, você pode mover seus scripts para outro local como / srv ou / opt ou / usr / local / bin / etc.

    
por 06.04.2017 / 18:44
-1

prueba:

usuario @ ubuntu: ~ $ touch script.sh usuario @ ubuntu: ~ $ chmod + x script.sh

usuario @ ubuntu: ~ $ $ crontrab -e

@reboot /home/usuario/script.sh

salve e reinicie seu pc

    
por 22.05.2018 / 05:13

Tags