web-dev-qa-db-fra.com

le script n'écrit pas dans le fichier lorsqu'il est exécuté à partir de cron

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
3
Sam
  1. 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"
    
  2. 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
    
  3. 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.

  4. 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.

5
John1024

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
0
Accountant م

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

0
Nick Sillito