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

51

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

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

#!/bin/bash

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

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

Eu o tornei executável chmod + x checkup.she funciona bem quando o executo no terminal via./checkup.sh

Minha entrada do crontab para este script é:

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

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

Então ... eu estou pensando que deve funcionar, a menos que eu não tenha feito algo realmente bobo. Além disso, você acha que é bom mudar esse script do bash /bin?

dearN
fonte
11
Eu o colocaria em / opt / bin ou ~ / bin como uma prática recomendada geral para não estragar onde os pacotes acham que as coisas estão.
precisa saber é o seguinte
Se você executar o script da seguinte maneira: /home/dnaneet/Desktop/./checkup.sh, ele funciona? Gostaria de colocar /home/dnaneet/Desktop/checkup.sh
LnxSlck 1/12/12
@LnxSlck Sim, a execução /home/dnaneet/Desktop/./checkup.shfunciona bem. Mas /home/dnaneet/Desktop/checkup.shpode não funcionar certo? Porque precisa de um ./?
Dearn
11
Acho que o cron não sabe nada sobre a sua sessão X.
Glenn Jackman
@glennjackman Então, o que isso significa? Isso significa que executar esse script no crontab não permite que uma mensagem pop-up apareça no ambiente do gnome?
Dearn

Respostas:

71

Uma coisa de cada vez:

Primeiro, vamos fornecer uma pasta bin baseada no usuário:

cd ~/ && mkdir bin

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

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

Ok, então isso funciona

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

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

executar uma vez por minuto até que funcione
Não, você não precisa de ./ no meio da linha. ./ é para quando você fornece URLs relativos.
Ok, então isso funciona

Agora vamos tentar executar um script que chama xmessage

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

não está funcionando

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

Vamos fazer com que o nosso pareça um pouco com o arquivo cron apropriado 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

Defina para executar 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 $3 }')

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

Ok, então isso funciona ... o que fizemos?
Alteramos todos os comandos para não depender de caminhos que não definimos explicitamente
. Executamos nosso script explicitamente com bash
. Dissemos ao script que esperamos estar em DISPLAY: 0.0

RobotHumans
fonte
Obrigado pela resposta. Você disse: "Vamos fazer com que o nosso pareça um pouco com o arquivo cron apropriado do anacron ... eu salvei isso como teste" .. NOSSO o quê? O arquivo crontab? :-/
precisa saber é
Aqui está o que eu observei. Primeiro eu tive que me livrar do espaço antes e depois =da linha especificando DISPLAY. Segundo, quando editei meu arquivo crontab e adicionei o PATHsugerido e defina o horário para execução posterior, a janela pop-up não será exibida. No entanto, a janela pop-up mostrou-se bem ao executar o script usando /bin/bash... o que dá?
precisa saber é
O que você sabe, depois que mudei meu script export DISPLAY=:0.0, funcionou bem. Embora tenha havido um intervalo significativo de cerca de 5 segundos após o relógio bater a hora em que minha janela pop-up deveria ter mostrado ... Alguma sugestão? Mas sim, você altera o trabalho do script!
precisa saber é
Não faço ideia do atraso de 5 segundos.
precisa saber é o seguinte
3
Eu amo o jeito que você passou por este passo a passo e depois resumiu - obrigado!
Jbobbins
10

O problema foi resolvido, leia o manual no Google:

descrição:

  1. Eu tenho script usando #!/bin/bashcomo cabeçalho
  2. Eu coloquei o script /home/wc3/palert/

análise:

  1. O crontab não pode executar meu script
  2. Mas se eu correr manualmente, ele mostra a saída e também posso ver o resultado na minha web
  3. Isso significa que o crontab não pode ter um ambiente diferente quando você executa seu script na sua pasta de scripts

responda:

  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
    

    mude isto: /home/wc3/palert
    com: o lugar que você colocou seu script/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.

budi satriyo
fonte
não funciona para mim #
3111 John Joe
Trabalhe como um encanto para mim!
1rq3fea324wre 27/09