Domanda

Ho uno script di Rails che vorrei eseguire quotidianamente. So che ci sono molti approcci e che un approccio croncode script / runner è disapprovato da alcuni, ma sembra soddisfare le mie esigenze.

Tuttavia, il mio script non viene eseguito come programmato.

La mia applicazione risiede in / data / myapp / current e lo script si trova in script / myscript.rb . Posso eseguirlo manualmente senza problemi come root con:

/data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb

Quando lo faccio, il file di registro speciale ( log / myscript.log ) viene registrato come previsto:

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

L'ho impostato per funzionare con cron ogni mattina alle 4 del mattino. crontab di root :

$ crontab -l
0 4 * * * /data/myapp/current/script/runner -e production /data/myapp/current/script/myscript.rb

In effetti, sembra che abbia provato a funzionare di recente come stamattina!

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

Tuttavia, non vi è alcuna voce nel mio file di registro e i dati che dovrebbe aggiornare non sono stati aggiornati. Le autorizzazioni per i file di registro (come test) sono state persino impostate su scrivibili a livello globale:

$ ls -lh
total 19M
...
-rw-rw-rw- 1 myuser apps 7.4K Mar  3 13:19 myscript.log
...

Sono in esecuzione su CentOS 5.

Quindi le mie domande sono ...

  1. Dove altro posso cercare informazioni per eseguire il debug di questo?
  2. Potrebbe essere un problema SELinux? Esiste un contesto di sicurezza che è possibile impostare o modificare per risolvere questo errore?

Grazie!

Aggiorna

Grazie a Paolo e Luca entrambi. Si è rivelato essere un problema di ambiente e l'acquisizione di stderr in un file di registro mi ha permesso di trovare l'errore.

$ 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'

L'aggiunta dell'eseguibile Ruby specifico al comando ha fatto il trucco:

$ 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
È stato utile?

Soluzione

Di default cron invia il suo output all'utente che lo ha eseguito. Potresti guardare lì.

È molto utile reindirizzare l'output degli script eseguiti da cron in modo da poter guardare i risultati in un file di registro invece che nella posta locale di qualche utente casuale sul server.

Ecco come reindirizzare stdout e stderr a un file di registro:

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

> > reindirizza stdout su un file e 2 > & amp; 1 reindirizza stderr su stdout in modo che anche tutti i messaggi di errore vengano registrati.

Fatto ciò, sarai in grado di esaminare i messaggi di errore per vedere cosa sta realmente succedendo.

Altri suggerimenti

Il solito problema quando qualcuno scopre che il suo script non verrà eseguito in un processo cron quando verrà eseguito dalla riga di comando è che si basa su un pezzo di ambiente che ha una sessione interattiva ma cron non ottiene. Alcuni candidati frequenti sono il "PERCORSO" ambiente, e possibilmente " HOME " ;.

Su Linux, assicurarsi che tutti i file di configurazione (/ etc / crontab, /etc/crond.{daily,hourly,etc}/* e /etc/cron.d/*) siano scrivibili solo sulla radice dell'utente e siano non link simbolici, altrimenti non verranno nemmeno presi in considerazione.

Per consentire collegamenti non root e / o symlink, specificare l'opzione -p sul demone crond.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top