Já vi muitas vezes ( 1 , 2 ) essa pergunta, mas não encontrei a resposta, então aqui vou eu.
Estou executando o Debian 11 , mas acho que funciona da mesma forma para qualquer distribuição semelhante ao Debian.
Minha crontab -e
parece:
...
@reboot sleep 20 && /opt/isPromscaleOnOrOff.sh
...
E o conteúdo de isPromscaleOnOrOff.sh
:
#!/bin/bash
SERVICE="promscale"
if pgrep -x "$SERVICE" >/dev/null
then
echo "$SERVICE is running"
else
echo "$SERVICE is stopped, I will run it now"
nohup promscale --db-name asdf1234--db-password asdf1234 --db-user asdf1234 --db-ssl-mode allow --install-extensions & >> /dev/null
disown
fi
Mas quando reinicio a VM, o script não está em execução, embora os logs do cron em /var/log/syslog mostrem o crontab iniciando o script.
O que eu quero alcançar pode ser feito facilmente daemonizando o processo (o que eu realmente fiz), eu só quero saber por que o crontab não inicia meu script.
Os trabalhos executados
cron
não são executados no mesmo ambiente de tempo de execução que você tem em sua área de trabalho. Nenhuma de suasPATH
alterações ou outras configurações de variáveis de ambiente~/.bashrc
são propagadas automaticamente para seucron
trabalho. Por exemplo, não há$DISPLAY
, então os programas GUI precisam de tratamento especial (leiaman xhost
).Pode-se definir variáveis de ambiente para todos os
cron
trabalhos nocrontab
arquivo Readman 5 crontab
.Veja os resultados de
echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias
em cada um de seus ambientes.Como a
command
parte dacrontab
linha é, por padrão, interpretada por/bin/sh
, que tem uma sintaxe mais simples que/bin/bash
, recomendo quecommand
seja feita uma chamada para umbash
script (executável, montado, começa com#!/bin/bash
) que configura o ambiente e depois chama o programa desejado.