it-swarm.com.de

Skript schreibt nicht in Datei, wenn es von cron ausgeführt wird

Wenn ich ein/bin/bash-Skript ausführe, funktioniert es einwandfrei und es meldet sich bei einigen Protokolldateien innerhalb des Skripts an. Aber wenn ich es von Cron aus starte, loggt es sich nicht in die Datei ein! es meldet sich nur unter/var/mail/root an und sagt dies

Date: Fri, 12 Aug 2016 08:39:01 +0300 (MSK)

/bin/sh: 1: root: not found

das ist das Drehbuch:

#!/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}

und das ist der cron:

45 8 * * *  /home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.sh > /dev/null
3
Sam
  1. Ersetzen Sie Folgendes, um die Protokolldatei an die erwartete Position zu bringen:

    LOG_FILE="test-crontab.log"
    

    Mit:

    LOG_FILE="/home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.log"
    
  2. Der Befehl [[ ${?} != 0 ]] ist nur Bash. Aus der von Ihnen angegebenen Fehlermeldung geht hervor, dass das Skript unter /bin/sh ausgeführt wird. Eine Möglichkeit, dies zu beheben, besteht darin, Folgendes zu ersetzen:

    if [[ ${?} != 0 ]]; then
    

    Mit:

    if [ ${?} != 0 ]; then
    

    Ein anderer Ansatz ist, crontab -e auszuführen und die folgende Zeile zu Ihrer crontab -Datei hinzuzufügen:

    Shell=/bin/bash
    
  3. Erwägen Sie außerdem, der Einfachheit und des Stils halber Folgendes zu ersetzen:

    echo `date` >> ${LOG_FILE}
    

    mit:

    date >> "${LOG_FILE}"
    

    Dies beseitigt eine nutzlose Verwendung von Echo.

  4. Stellen Sie abschließend alle Shell-Variablen in doppelte Anführungszeichen, insbesondere $LOG_FILE. Da der aktuelle Wert von LOG_FILE keine Leerzeichen oder Shell-aktiven Zeichen enthält, wird dies jetzt nicht benötigt. Wenn Sie sie jedoch in doppelte Anführungszeichen setzen, vermeiden Sie in Zukunft unangenehme Überraschungen.

5
John1024

Das Arbeitsverzeichnis in meinem Fall war /home/me, daher wird ein relativer Pfad wie test-crontab.log meist in /home/me/test-crontab.log aufgelöst.

Ich mag die Idee nicht, die Pfade in den Dateien zu ändern und sie weniger portabel zu machen, stattdessen ändere das Verzeichnis in der Cronjob-Zeile

cd /path/to/directory && ./bin/myapp
0
Accountant م

Ich denke, dass Ihr Crontab-Eintrag falsch ist.

Das Format der Ubuntu Crontab-Datei lautet "m h dom mon dow user command", wobei die ersten 5 Einträge den Zeitpunkt angeben, an dem der Job ausgeführt wird. Der 6. Eintrag ist der Benutzer, der den Job ausführt (ich denke, dass dies in Ihrem Eintrag fehlt), und der 7. Eintrag ist der Befehl, den Sie ausführen möchten.

Ich denke, dass Sie Ihre crontab Linie zu korrigieren sollten

45 8 * * * root /home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.sh>/dev/null

vorausgesetzt, Sie möchten, dass der Befehl als root ausgeführt wird

0
Nick Sillito