Meu trabalho cron não é executado

0
  1. Eu configurei para executar o comando notificar-enviar a cada minuto,

    $ crontab -l
    1 * * * * /usr/bin/notify-send -t 0 "hello"
    

    Por que isso não funciona? Preciso reiniciar o sistema operacional depois de editar o arquivo crontab?

  2. O seguinte significa que cron está sendo executado?

    $ ps aux | grep -i cron
    root      1038  0.0  0.0  23660  2420 ?        Ss   Apr20   0:00 cron
    
  3. Posso especificar um horário mais frequente, como 30 segundos? Pode o tempo ser especificado como decimais?

    0.5 * * * * /usr/bin/notify-send -t 0 "hello"
    
por Tim 22.04.2015 / 00:39

3 respostas

2

Seu primeiro problema é que você tem a sintaxe errada para executar um trabalho a cada minuto:

1 * * * * /usr/bin/notify-send -t 0 "hello"

O 1 no primeiro campo significa que o trabalho é executado apenas 1 minuto após cada hora. Altere de 1 para * :

* * * * * /usr/bin/notify-send -t 0 "hello"

O segundo problema é que as tarefas agendadas são executadas em um ambiente muito limitado. No meu sistema (Linux Mint), as únicas variáveis de ambiente definidas são $HOME , $LOGNAME , $PATH , $LANG , $SHELL e $PWD - e $PATH é normalmente definido como "/usr/bin/:/bin" .

No mínimo, a falta de uma configuração para $DISPLAY significa que notify-send não pode exibir nada.

Uma rápida experiência com:

* * * * * DISPLAY=:0.0 notify-send "hello from crontab"

resultou neste erro:

(notify-send:18831): GLib-GObject-CRITICAL **: g_object_unref: assertion 'G_IS_OBJECT (object)' failed

(estou executando a área de trabalho do Gnome.)

Em outra experiência, copiei todo o meu ambiente interativo em um script e editei o script para definir explicitamente todas as variáveis de ambiente e invocar notify-send . Isso realmente funciona; Agora estou recebendo uma mensagem pop-up "hello from crontab" a cada minuto.

Tenho certeza de que não preciso de todo meu ambiente interativo para que isso funcione, mas não sei exatamente quais variáveis de ambiente são necessárias ou quais devem ser seus valores. É muito provável que algumas das variáveis necessárias sejam definidas quando a sessão de login atual é iniciada e que elas serão alteradas se eu fizer o logout e o login novamente. Também é muito provável que os detalhes variem dependendo do ambiente de área de trabalho que você está usando.

Esta não é uma solução completa, mas deve dar-lhe um ponto de partida - e talvez outra pessoa possa adicionar os detalhes relevantes.

    
por 22.04.2015 / 01:08
1

Seu trabalho cron quase certamente está em execução. No entanto, você não pode (facilmente) interagir com sua GUI em cron , então, infelizmente, notify-send falhará.

Você pode provar se a sua tarefa cron está sendo executada, modificando a linha crontab da seguinte maneira

1 * * * * ( date; notify-send /usr/bin/notify-send -t 0 "hello"; echo ) >>cron.log 2>&1

Isso gravará a data e qualquer saída do comando notify-send em um arquivo de log chamado cron.log em seu diretório pessoal.

Observe, no entanto, que, conforme copiado de sua pergunta, isso será executado somente no primeiro minuto de cada hora ( 1 * * * * ). Para rodar a cada minuto, você precisaria usar * * * * * ("every minute" em vez de "1st minute"). Parabéns ao @KeithThompson por apontar isso.

A granularidade de cron é um minuto. Se você precisar executar um trabalho com mais freqüência do que isso, convém considerar um daemon independente ou duas linhas em cron , uma das quais é precedida por sleep 30 .

    
por 22.04.2015 / 00:45
0
$ crontab -l
*/1 * * * * /usr/bin/notify-send -t 0 "hello"

tente isso se você quiser executar seu cron a cada minuto.

    
por 22.04.2015 / 00:48

Tags