Gewusst wie: Debuggen eine Frage der cron ist nicht die Ausführung einer Skript — oder anderen?
Ich habe eine Rails-script möchte ich täglich ausgeführt werden. Ich weiß, es gibt viele Ansätze, und dass ein cron-würde script/runner
Ansatz ist verpönt, aber es scheint meinen Anforderungen entsprechen.
Aber mein script wird nicht immer ausgeführt wie geplant.
Meine Anwendung lebt auf /data/myapp/current
, und das Skript ist in script/myscript.rb
. Ich kann es manuell ausführen, ohne problem als root
mit:
/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb
Wenn ich das Tue, ist der spezielle log-Datei (log/myscript.log
) wird protokolliert, 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 zu laufen mit cron
jeden morgen um 4 Uhr. root
's crontab:
$ crontab -l
0 4 * * * /data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb
In der Tat, es sieht aus wie es versucht zu laufen, wie vor kurzem, als heute morgen!
$ 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)
...
Jedoch, dort ist kein Eintrag in meine log-Datei, und die Daten, die Sie aktualisieren sollten, wurde nicht immer aktualisiert. Die log-Datei Berechtigungen (als test) wurden sogar Global beschreibbar:
$ ls -lh
total 19M
...
-rw-rw-rw- 1 myuser apps 7.4K Mar 3 13:19 myscript.log
...
Läuft bei mir auf CentOS 5.
Also meine Fragen sind...
- Wo kann ich sonst noch nach Informationen suchen zu Debuggen?
- Könnte dies ein SELinux-Problem? Gibt es einen Sicherheits-Kontext konnte ich einstellen oder ändern, das könnte diesen Fehler beheben?
Danke!
Update
Danke an Paul und Lukas beide. Es hat entpuppen sich ein Umwelt-Problem, und die Erfassung der stderr
eine log-Datei, die es mir ermöglicht, den Fehler zu 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'
Hinzufügen der spezifischen Ruby-ausführbare Datei der Befehl hat den 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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Standardmäßig cron-mails seiner Ausgabe an den Benutzer, lief es. Man konnte sich dort.
Es ist sehr nützlich, so leiten Sie die Ausgabe des Skripts durch cron, so dass Sie die Ergebnisse in eine log-Datei, statt einige zufällige Benutzer, lokale E-Mails auf dem server.
Sehen Sie hier, wie umleiten von stdout und stderr in eine log-Datei:
Den
>>
umleiten von stdout in eine Datei, und die2>&1
leitet stderr auf stdout ausgegeben, so dass alle Fehlermeldungen werden protokolliert.Nachdem dies erledigt ist, werden Sie in der Lage zu prüfen, die Fehlermeldungen zu sehen, was wirklich Los ist.
Das übliche problem, wenn jemand entdeckt Ihr Skript wird nicht ausgeführt in einem cron-job, wenn es von der Befehlszeile aus ausgeführt ist, dass er sich auf ein Stück der Umgebung, die eine interaktive Sitzung hat aber cron nicht erhalten. Einige häufige Kandidaten sind der "PFAD" Umwelt und möglicherweise "zu HAUSE".
Unter Linux, stellen Sie sicher, dass alle config-Dateien (/etc/crontab, /etc/crond.{Sie täglich,stündlich,etc}/* und /etc/cron.d/*) sind nur schreibbar für den Benutzer root und nicht symlinks, sonst werden Sie auch nicht berücksichtigt werden.
Erlauben nicht-root-und/oder symlinks, geben Sie die option-p an den crond-daemon.