Wie ein Problem von cron ist debuggen nicht einem bestimmten Skript ausgeführt - oder andere?
-
03-07-2019 - |
Frage
Ich habe einen Rails-Skript, das ich täglich ausgeführt werden sollte. Ich weiß, es gibt viele Ansätze, und dass ein cron'd script/runner
Ansatz wird von einigen verpönt, aber es scheint, meine Bedürfnisse zu erfüllen.
Allerdings ist mein Skript nicht ausgeführt zu werden als geplant.
Meine Anwendung lebt bei /data/myapp/current
, und das Skript ist in script/myscript.rb
. Ich kann es manuell ohne Problem als root
laufen mit:
/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb
Wenn ich das tue, die spezielle Protokolldatei (log/myscript.log
) angemeldet wird, wie erwartet:
Tue Mar 03 13:16:00 -0500 2009 Starting to execute script...
...
Tue Mar 03 13:19:08 -0500 2009 Finished executing script in 188.075028 seconds
Ich habe es Set mit cron
jeden Morgen um 4.00 Uhr zu laufen. root
crontab:
$ crontab -l
0 4 * * * /data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb
In der Tat sieht es aus wie es versucht hat, erst heute Morgen laufen!
$ tail -100 /var/log/cron
...
Mar 2 04:00:01 hostname crond[8894]: (root) CMD (/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb)
...
Mar 3 04:00:01 hostname crond[22398]: (root) CMD (/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb)
...
Allerdings gibt es keinen Eintrag in meiner Protokolldatei, und die Daten, die sie aktualisieren sollten nicht aktualisiert wurde zu werden. Die Log-Dateiberechtigungen (als Test) wurden sogar eingestellt beschreibbaren global:
$ ls -lh
total 19M
...
-rw-rw-rw- 1 myuser apps 7.4K Mar 3 13:19 myscript.log
...
Ich arbeite auf CentOS 5.
Also meine Fragen sind ...
- Wo sonst kann ich nach Informationen suchen, dies zu debuggen?
- Könnte dies ein SELinux Problem sein? Gibt es einen Sicherheitskontext, die ich einstellen oder ändern könnte, die diesen Fehler beheben könnte?
Danke!
Aktualisieren
Vielen Dank an Paul und Luke beide. Es hat sich heraus ein Thema Umwelt sein, und die Erfassung der stderr
in eine Protokolldatei konnte ich den Fehler finden.
$ cat cron.log
/usr/bin/env: ruby: No such file or directory
$ head /data/myapp/current/script/runner
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/boot'
require 'commands/runner'
Das Hinzufügen der spezifischen Ruby-ausführbare auf den Befehl der Trick:
$ crontab -l
0 4 * * * /usr/local/bin/ruby /data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb >> /data/myapp/current/log/cron.log 2>&1
Lösung
Standardmäßig cron Mails seine Ausgabe an den Benutzer, der es lief. Man könnte es aussehen.
Es ist sehr nützlich, um die Ausgabe von Skripten, die von cron zu umleiten, so dass Sie die Ergebnisse in einer Protokolldatei anstatt einig zufälligen Benutzer lokaler E-Mail auf dem Server suchen.
Hier ist, wie Sie stdout und stderr in eine Protokolldatei umleiten würde:
cd /home/deploy/your_app/current; script/runner -e production ./script/my_cron_job.rb >> /home/deploy/your_app/current/log/my_file.log 2>&1
Die >>
umleiten stdout in eine Datei, und und die 2>&1
leitet stderr nach stdout so Fehlermeldungen als auch protokolliert werden.
Nachdem dies getan, können Sie die Fehlermeldungen untersuchen, um zu sehen, was wirklich vor sich geht.
Andere Tipps
Das übliche Problem, wenn jemand entdeckt sie Skript wird in einem Cron-Job nicht ausgeführt werden, wenn es von der Kommandozeile ausgeführt wird, ist, dass es auf einig Stück der Umwelt beruht, dass eine interaktive Sitzung hat aber cron nicht bekommen. Einige häufige Kandidaten sind die „PATH“ Umwelt und möglicherweise „HOME“.
Unter Linux, stellen sicher, dass alle Konfigurationsdateien (/ etc / crontab, /etc/crond.{daily,hourly,etc}/* und /etc/cron.d/*) sind nur beschreibbar Benutzer root und sind Symlinks nicht, sonst werden sie nicht einmal in Betracht gezogen werden.
Damit nicht-root und / oder Symlinks, geben Sie die Option -p zum crond Daemon.