2016-07-16 11 views
2

Ich habe einen Bash-Skript, das ich will alle 15 Minuten ausgeführt werden, so dass ich hinzugefügt, um diese Linie zu meiner crontab:Bash-Skript läuft manuell im Terminal aber nicht ausgeführt von crontab

7,22,37,52 * * * * /path/to/my/script.sh 

ich eingecheckt habe der Verzeichnispfad ist korrekt und das Skript läuft korrekt, wenn ich einfach /path/to/my/script.sh manuell aus einem beliebigen Verzeichnis ausführen. Ich habe diese Knall Linie in meinem Skript:

#!/usr/bin/env bash 

Mein Skript auch andere Skripte im selben Verzeichnis wie es verweist, und ich habe chmod +x auf alle Skripte ausführen, die benötigt werden. Ich habe die MAILTO auf meine E-Mail-Adresse und ich war einige Cron-Daemon E-Mails bekommen, wenn ich die Zeile in meinem crontab geändert:

7,22,37,52 * * * * sh /path/to/my/script.sh 

Aber ich bekam nie E-Mails bei der Verwendung

7,22,37,52 * * * * /path/to/my/script.sh 

oder

Ich habe sichergestellt, Cron läuft und ich habe auch versucht, die Ausgabe meines Skripts in eine Protokolldatei, die auch nur in geschrieben wird, wenn ich die sh. Wenn ich jedoch sh /path/to/my/script.sh aus dem Home-Verzeichnis ausführen, funktioniert es nicht. Die einzige Möglichkeit, wie mein Skript läuft, ist, wenn (aus einem beliebigen Verzeichnis) ich /path/to/my/script.sh oder bash /path/to/my/script.sh aufrufen. Ich bin ziemlich neu beim Schreiben von Bash-Skripten, daher ist jede Hilfe sehr willkommen.

+0

Fragen über die Verwendung von 'cron' sind besser geeignet für superuser.com oder unix.stackexchange.com. – Barmar

+0

Ah ja. Ich habe das vergessen ... Aber die Konfiguration von Cron ist ein häufiges Problem für viele. – Xofo

+0

Lesen Sie unbedingt https://help.ubuntu.com/community/CronHowto – Xofo

Antwort

1

Crontab Einträge sollten folgendes Format haben

m h dom mon dow command 

, die bestätigt, dass Ihr Eintrag unter

7,22,37,52 * * * * /path/to/my/script.sh 

korrekt ist. Nachdem Sie das gesagt haben, müssen Sie den Crontab-Editor (:wq) schließen, damit die Änderungen wirksam werden.

Es wird empfohlen, dass Sie [ this ] Cross-Site-Post gehen, die die möglichen Probleme mit Cron-Jobs darstellt.


Mehr über Hash-Bang [ here ].

+0

Ich habe meinen crontab-Editor korrekt gespeichert und geschlossen. Ich denke, nach dem Beenden bekomme ich die Nachricht: crontab: installiere neue crontab. – pvas

+0

@pvas: Haben Sie die Tipps in meinem Link und andere Antwort folgen? Ich würde auch empfehlen, Cron-Daemon neu zu starten – sjsam

3

@pvas Die Cron-Benutzerumgebung sollte mit besonderer Sorgfalt behandelt werden. Die meisten Benutzer haben die Möglichkeit, auf Pfade, Verzeichnisse, Berechtigungen usw. zuzugreifen. Das ist bei weitem nicht der Fall. Cron läuft in einer minimalen Umgebung und Sie müssen ALLES einrichten - Pfade, Berechtigungen und den Ort, von dem aus die Skripte laufen.

1) Ich richte die Umgebung selbst ein.

2) Ich verwende vollständig erweiterte Pfade in meinen Crontabs.

3) Ich stelle sicher, dass alle Verzeichnisse, die gelesen werden müssen, Leseberechtigungen haben.

4) Ich vergewissere mich, dass mein Passwort nicht abläuft, weil das Cron blockieren wird, wenn es dies tut.

5) Stellen Sie sicher, dass zugrundeliegende Skripte explizit (von Perl, Bash, Python, was auch immer) aufgerufen werden.

6) Verlegen Sie den Befehl auf der Cron-Linie zu einer LOG-Datei (noch besser eine Protokolldatei mit einem TIMESTAMP).

Reparieren Sie diese Dinge und versuchen Sie es erneut. Cron ist besonders, du musst alles einrichten.

Zum Beispiel:

#SETUP ENVIRONMENT 
SHELL=/bin/bash 
source /home/userfoo/.bash_profile 

#RUN THE SCRIPT everyday at 11:50pm (23:50) 
50 23 * * * userfoo /home/userfoo/script.sh >> LOGFILE.txt 

< <

+0

Ich überprüft, dass alles in Ihrer Liste an meinem Ende korrekt war und änderte meine Zeile zu: 7,22,37,52 * * * * my_username /path/to/my/script.sh, einschließlich mein Benutzername wie in Ihrem Beispiel, und jetzt der Cron Daemon E-Mailer sagt:/bin/sh: 1: mein_Benutzername: nicht gefunden, obwohl, wenn ich echo $ USER ausführen, ich my_username. Irgendwelche Ideen? – pvas

+1

Funktioniert es jetzt? Stellen Sie außerdem sicher, dass in script.sh KEINE relativen Pfade vorhanden sind und dass es sich um das Verzeichnis handelt, von dem aus oder von wo aus es aufgerufen wurde - das kann ein anderes Problem sein. auch PIPE alles in ein Protokoll 7,22,37,52 * * * * bash /path/to/my/script.sh >> LOG.TXT – Xofo

+1

All meine Variablen haben Erklärungen mit absoluter paths- dem einzigen Diejenigen, die relativ sind, wenn ich Dateien nach dem cd'ing zum erforderlichen Verzeichnis erstelle. Ich deklariere auch PATH = $ {PATH}:/path/to/my_bin und exportiere PATH in einem der Skripte, auf die mein Hauptskript verweist. Außerdem referenziert mein Hauptscript script.sh einige Perl-Skripte - könnte das das Problem sein? In allen Perl-Skripten schließe ich ein: #!/Usr/bin/env perl. Außerdem ist meine LOG.txt-Datei leer, obwohl sie erstellt wurde. Wenn ich das Skript manuell benutze entweder bash /path/to/my/script.sh oder /path/to/my/script.sh, bekomme ich keine Ausgabe in der Befehlszeile – pvas