Wie ein Problem von cron ist debuggen nicht einem bestimmten Skript ausgeführt - oder andere?

StackOverflow https://stackoverflow.com/questions/607599

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 ...

  1. Wo sonst kann ich nach Informationen suchen, dies zu debuggen?
  2. 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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top