Was ist los mit diesen beiden Cronjobs?


13

Ich habe folgende Cron Jobs definiert.

55  8   *   *   3   /usr/bin/php /home/mark/dev/processes/customClient/events.php > /home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv
0   9   *   *   3   /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s 'Events from `date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`' -a '/home/mark/dev/processes/customClient/events-`date +%Y-%m-%d --date='last Wednesday'`-`date +%Y-%m-%d`.csv'

Es scheint richtig zu funktionieren, wenn ich den obigen Befehl direkt über die Befehlszeile ausführe. Aber als ich heute Morgen die Ausführung des Skripts überprüfte, erhielt ich eine E-Mail mit der Aussage (ich paraphrasiere, weil ich sie versehentlich gelöscht habe), dass die hinteren Häkchen nicht richtig geschlossen wurden.


Zu Ihrer Information Ich habe gerade die Cron-Jobs erneut getestet und die folgenden Fehler erhalten. /bin/sh: 1: Syntax error: EOF in backquote substitution Für den ersten Cronjob. /bin/sh: 1: Syntax error: Unterminated quoted string Für den zweiten Cronjob.
Mark D

2
Backticks sind aus diesem Grund veraltet . Das Ändern von zu $(...)hilft Ihnen bei der
Lösung der Zitatprobleme

1
Sie wollen auf jeden Fall eine Frage von mir überprüfen. Es gibt eine Antwort von Stephane Chazelas, die erklärt, wie Sie eine interaktive Shell erstellen können, die mit der Umgebung identisch ist, die Ihr Cron-Job sehen wird. Wenn Sie seine kleine Prozedur durchlaufen, erhalten Sie eine Eingabeaufforderung und können Ihren Cronjob Schritt für Schritt testen und feststellen, wo er fehlschlägt. unix.stackexchange.com/a/56503/16841 Sicher, dass Ihre Frage nicht zu 100% übereinstimmt, aber es kann Ihnen bei der Behebung von Crontab-Problemen helfen.
jippie

Antworten:


14

Ich empfehle dringend, nicht-triviale Cron-Jobs aus vielen Gründen in ihre eigene Shell-Skriptdatei zu stellen:

  • Einfacher zu debuggen: Sie können das Skript einfach ausführen, anstatt eine lange Zeile einzufügen, und mit der richtigen Shebang-Zeile verhält es sich viel vorhersehbarer, als wenn Sie dieselben Befehle direkt in der Crontab hätten
  • Einfacher zu lesen: Sie müssen es nicht zu einem Einzeiler mit mehr als 200 Zeichen machen, sondern können es schön formatieren, sodass es für alle leicht zu lesen und zu verstehen ist
  • Fügen Sie das Skript der Versionskontrolle hinzu

8
Und wenn Sie die lästigen %Zeichen in das Skript croneinfügen, verhindern Sie, dass sie in Zeilenumbrüche umgewandelt werden. Dies ist Ihr eigentliches Problem.
Ian D. Allen

Ich stimme dir nicht zu. Sie neigen dazu zu vergessen, welches Skript was tut. Ich spreche aus Erfahrung.
Sridhar Sarnobat

30

Es gibt drei häufige Ursachen für das unterschiedliche Verhalten von Cron-Job-Befehlen im Vergleich zu Befehlen, die direkt in eine interaktive Shell eingegeben wurden.

  • Cron bietet eine begrenzte Umgebung, z. B. ein Minimum $PATH, und andere erwartete Variablen fehlen.
  • Cron ruft /bin/shstandardmäßig auf, während Sie möglicherweise eine andere Shell interaktiv verwenden.
  • Cron behandelt den %Charakter besonders (er wird im Befehl in eine neue Zeile umgewandelt).
  • Cron bietet kein Terminal oder eine grafische Umgebung.

Sie müssen allen %Zeichen ein \in einer crontab-Datei voranstellen , wodurch cron angewiesen wird, nur ein Prozent in den Befehl einzufügen. Denken Sie daran, wenn Sie den dateBefehl in einem Cron-Job verwenden.

55  8   *   *   3   /usr/bin/php /home/mark/dev/processes/customClient/events.php > "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"
0   9   *   *   3   /usr/bin/echo 'The csv for last week, trying my hand at automatiging this' | /usr/bin/mutt <emailaddress> -s "Events from $(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d)" -a "/home/mark/dev/processes/customClient/events-$(date +\%Y-\%m-\%d --date='last Wednesday')-$(date +\%Y-\%m-\%d).csv"

Ich habe auch einige Zitatprobleme behoben:

  • Dies verursachte keine Probleme außer mit der Lesbarkeit, aber Sie sollten keine Backticks für die Befehlsersetzung verwenden. Verwenden Sie $(…)stattdessen: Die Parsing-Regeln sind einfacher.
  • Verwenden Sie immer doppelte Anführungszeichen um Variablen- und Befehlsersetzungen: "$somevariable", "$(somecommand)". Hier war das Fehlen von Anführungszeichen harmlos, da der dateBefehl für die von Ihnen verwendeten Formate keine Sonderzeichen zurückgab, Sie sich jedoch genau merken müssen, welche Sonderzeichen besonders sind, und dies jedes Mal überprüfen, wenn Sie eine Ersetzung ohne Anführungszeichen lassen. Halten Sie es einfach, verwenden Sie immer doppelte Anführungszeichen, es sei denn, Sie möchten, dass Feldteilung und Dateinamengenerierung für das Ergebnis durchgeführt werden.
  • Sie hatten einige einfache Anführungszeichen, die eine Erweiterung um einige Befehlsersetzungen verhinderten. Verwenden Sie stattdessen doppelte Anführungszeichen.

0

Sie scheinen 'im muttBefehl verschachtelt zu sein :

'Ereignisse von date +%Y-%m-%d --date='last Wednesday'- date +%Y-%m-%d'

Versuchen Sie, "anstelle des inneren zu verwenden, 'damit die Anweisung lautet

'Ereignisse von date +%Y-%m-%d --date="last Wednesday"- date +%Y-%m-%d'


Ich bin nicht sicher, ob das das Problem ist. Aber nachdem sie es in beiden Cronjobs ausprobiert haben, werden sie ohne Erfolg ausgeführt.
Mark D
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.