Lorsque j'exécute un script/bin/bash, cela fonctionne correctement et il se connecte à certains fichiers journaux du script. Mais, quand je le lance à partir de cron, il ne se connecte pas au fichier! il se connecte uniquement à/var/mail/root, en disant que
Date: Fri, 12 Aug 2016 08:39:01 +0300 (MSK)
/bin/sh: 1: root: not found
c'est le script:
#!/bin/bash
LOG_FILE="test-crontab.log"
echo "started testing cron" >> ${LOG_FILE}
pgrep tunnel
if [[ ${?} != 0 ]]; then
echo "Tunnel process is not running..." | tee -a ${LOG_FILE}
echo "initializing tunnel..." | tee -a ${LOG_FILE}
/usr/local/bin/stunnel | tee -a ${LOG_FILE} 2>&1
fi
echo `date` >> ${LOG_FILE}
et voici le cron:
45 8 * * * /home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.sh > /dev/null
Pour obtenir le fichier journal où vous vous attendez, remplacez:
LOG_FILE="test-crontab.log"
Avec:
LOG_FILE="/home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.log"
La commande [[ ${?} != 0 ]]
ne concerne que bash. D'après le message d'erreur que vous citez, le script semble s'exécuter sous /bin/sh
. Une façon de résoudre ce problème consiste à remplacer:
if [[ ${?} != 0 ]]; then
Avec:
if [ ${?} != 0 ]; then
Une autre approche consiste à exécuter crontab -e
et à ajouter la ligne suivante à votre fichier crontab
:
Shell=/bin/bash
Aussi, pour plus de simplicité et de style, envisagez de remplacer:
echo `date` >> ${LOG_FILE}
avec:
date >> "${LOG_FILE}"
Ceci élimine une utilisation inutile d'écho.
Enfin, envisagez de placer des guillemets autour de toutes les variables du shell, en particulier $LOG_FILE
. Étant donné que la valeur actuelle de LOG_FILE
ne contient pas d'espaces ni de caractères actifs dans l'environnement Shell, cela n'est pas nécessaire maintenant. Mais mettre des guillemets doubles entre eux évitera de mauvaises surprises à l’avenir.
Le répertoire de travail dans mon cas était /home/me
donc un chemin relatif tel que test-crontab.log
va généralement être résolu en /home/me/test-crontab.log
Je n'aime pas l'idée de changer les chemins dans les fichiers et de le rendre moins portable, à la place change le répertoire sur la ligne de cronjob
cd /path/to/directory && ./bin/myapp
Je pense que votre entrée crontab est fausse.
Le format du fichier crontab ubuntu est "commande utilisateur unique", où les 5 premières entrées spécifient l'heure d'exécution du travail. La 6ème entrée est l'utilisateur qui exécute le travail (je pense que cela manque dans votre entrée) et la 7ème entrée est la commande que vous voulez exécuter.
Je pense que vous devriez corriger votre ligne crontab pour
45 8 * * * root /home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.sh>/dev/null
en supposant que vous voulez que la commande s'exécute en tant que root