Cronjob diferentes comportamentos

2

Eu criei um cronjob da seguinte maneira para executar um script. O script iniciou um serviço apenas se estivesse inativo.

Aqui está o script,

#!/bin/bash
service=influxdb

if (( $(ps -ef | grep -v grep | grep $service | wc -l) > 0 ))
then
echo "$service is running!!!"
else
service $service start
fi

Eu criei um cron job como esse,

alphauser@AlphaServer:~$ sudo crontab -e

E, em seguida, adicionou esta linha

* * * * * bash /home/alphauser/influx-start.sh > /home/alphauser/output-influx-start.txt

Eu armazenei a saída em um arquivo apenas para verificar sua saída.

O serviço parou e agora era a hora do cron mostrar sua mágica. Mas não conseguiu iniciar o serviço. Eu vi o arquivo de saída e isso foi escrito em que,

Starting influxdb...
influxdb process was unable to start [ FAILED ]

então eu removi este cronjob de sudo crontab -r .

Eu adicionei esta linha no final do arquivo etc/crontab , por exemplo,

* * * * * root bash /home/alphauser/influx-start.sh > /home/alphauser/outputinflux.txt

e funcionou. O serviço começou e esta foi a saída,

influxdb is running!!!

Eu quero saber por que ele falhou com sudo crontab -e , mas funcionou com o arquivo etc/crontab .

A autenticação do sudo não pode ser o problema porque eu adicionei no sudo crontab e por acaso se esse fosse o caso, ele teria dito You must be root to run this script .

    
por luv.preet 21.04.2017 / 16:39

1 resposta

5

Como @steeldriver notou: o comando service falha porque não está no caminho crontab . Mesmo como tarefas root, crontab executam em um ambiente que é bastante restrito em termos de variáveis ambientais. Você precisa incluir o caminho completo de muitos executáveis em um comando que deve ser executado pelo cron.

Neste caso, portanto,

/usr/sbin/service $service start

teria funcionado. Como sabemos qual é o caminho exato de um executável? Do which service e ele responderá /usr/sbin/service .

No entanto, o comando service está saindo e sendo substituído por seu systemd equivalent systemctl . Você faria systemctl start $service em um comando de terminal. Mesmo sem sudo , systemctl descobrirá que ele não está sendo executado como root e solicitará sua sudo password.

Em um crontab, você usaria o caminho completo para systemctl utility, que é /bin/systemctl .

Então, se você usar

/bin/systemctl start $service

deve funcionar.

    
por Jos 21.04.2017 / 17:30