O script não é executado via crontab, mas funciona bem autônomo

44

Eu tenho um script que me lembra de reiniciar o computador se uptime for mais do que, digamos, 3 dias (embora esteja definido como 0 dias agora apenas para verificar se o script está sendo executado, pois o computador subiu dia..).

Eu percebo que não é o roteiro mais elegante, mas estou tentando! :)

#!/bin/bash

up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print  }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"

Tornei-a executável em chmod + x checkup.sh e ela funciona bem quando eu a executo no terminal via ./checkup.sh

A entrada do meu crontab para este script é:

46 14 * * * /home/dnaneet/Desktop/./checkup.sh

Por isso, é executado às 14: 46hrs diariamente ...

Então ... eu estou pensando que deveria funcionar, a menos que eu não fizesse algo realmente bobo. Além disso, você acha que não há problema em mover este script bash para /bin ?

    
por drN 01.04.2012 / 20:52

2 respostas

59

Uma coisa por vez:

Primeiro, vamos dar a você uma pasta bin com base no usuário:

cd ~/ && mkdir bin

Você quer usar o crontab. Vamos começar com algo muito simples:

* * * * * touch /tmp/testing.txt

Ok, isso funciona

Agora vamos tentar executar um script que faça o mesmo

* * * * * /home/username/bin/touchtest.sh

para executar uma vez por minuto até que você comece a trabalhar | Não, você não precisa de um ./ no meio da linha. ./ é para quando você está dando URLs relativos.
Ok, então isso funciona

Agora vamos tentar executar um script que chame xmessage

* * * * * /home/username/bin/rebootwarn.sh

não funciona

Primeiro, precisamos não depender de variáveis de ambiente. Isso inclui configuração de caminho, configurações de x11 ou qualquer outra coisa (variáveis de ambiente python e ruby vêm à mente ...)

Vamos fazer a nossa parecer um pouco com o arquivo cron do anacron ... Eu salvei isso como teste

#Borrowed from anacron
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#End borrowed from anacron

* * * * *   /bin/bash /home/username/bin/test.sh

Definido para ser executado uma vez por minuto

crontab test para importá-lo

Para o script

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
export DISPLAY=:0.0
up=$(uptime | grep "day" > /home/dnaneet/uptime.foo && awk < /home/dnaneet/uptime.foo '{ print  }')

[[ $up -gt 0 ]] && xmessage -center "Restart!"'

Ok, então isso funciona ... o que fizemos?
Nós mudamos todos os comandos para não depender de caminhos que não definimos explicitamente Nós executamos nosso script explicitamente com bash
Nós dissemos ao script que esperamos estar no DISPLAY: 0.0

    
por RobotHumans 01.04.2012 / 22:10
8

O problema foi resolvido, leia o manual no Google:

descrição:

  1. Eu tenho script usando #!/bin/bash como cabeçalho
  2. eu coloquei o script em /home/wc3/palert/

análise:

  1. o crontab não pode executar meu script
  2. Mas se eu executar manualmente, mostro a saída e também posso ver o resultado na minha web
  3. Isso significa que o crontab não pode deixar o ambiente não como quando você executa seu script na sua pasta de script

resposta:

  1. coloque seu ambiente usando esta linha abaixo em seu script com:

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/wc3/palert
    

    altere isto: /home/wc3/palert
    com: o local em que você colocou seu script, por exemplo /home/budi/script.sh

amostra:

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/budi
# Script continues...

Tente colocar seu script no crontab.

    
por budi satriyo 04.04.2013 / 17:03

Tags