Problème d'exécution d'un script via le crontab
Bonjour à tous !
Je viens vers vous car je deviens fou avec une tache cron !
Contexte :
J'ai une api REST écrite en node.js, l'api est executé dans un screen (nommé api).
J'ai écrit un petit script de monitoring, qui va checker si l'api est accessible, si non, je kill le screen "api", relance un nouveau screen et y execute la commande du lancement de l'api.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
#!/bin/bash
url='http://api.*******.com/monit'
log="$(tail -n 50 /var/log/api/api.log)"
status="$(curl -s -o /dev/null -w "%{http_code}" $url)"
if [ $status = 502 ];
then
screen -S api-X quit
screen -d -m -S api
timeout 1 screen -S api -X stuff $'api\n' # api est un raccourcis pour relancer le serveur
timestamp=$(date +%s)
log_file="/var/log/api/error_"$timestamp".log"
echo $log > $log_file
echo 'log :'$log_file | mailx -s "API server restarted" adresse@mail.fr
fi
timeout() {
time=$1
command="/bin/sh -c \"$2\""
expect -c "set echo \"-noecho\"; set timeout $time; spawn -noecho $command; expect timeout { exit 1 } eof { exit 0 }"
if [ $? = 1 ] ; then
echo "Timeout after ${time} seconds"
fi
}
exit 0 |
Lorsque j'execute la commande dans le shell, en root et que mon serveur est down, il est bien relancé, tout s'execute comme il faut.
Par contre, lorsque j'inscrit l'execution au crontab
Code:
* * * * * sh /home/api_monitor/monit.sh
le screen est bien coupé, puis relancé, mais par contre la commande dans le screen n'est pas reconnue.
J'ai deja localisé le problème, le screen est executé en /bin/sh à la place de /bin/bash
Code:
1 2 3 4
|
sh-4.2# api
sh: api: command not found
sh-4.2# |
J'ai donc essayer d'executer /bin/bash avant d'executer la commande de lancement de mon serveur, mais la cette fois ci c'est la commande qui n'est pas reconnue
Code:
1 2 3
|
root@ks******:~# api
/usr/bin/env: node: No such file or directory |
Vous avez tous les détails ! SI vous avez besoin de plus n’hésitez pas a demander.
Je vous remercie d'avance !