Domanda

Sto eseguendo il seguente script su un cronjob ...

cd /etc/parselog/
php run_all.php >/dev/null

e visualizzo i seguenti errori:

[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './pdo.so' - ./pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './mysql.so' - ./mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './mysql.so' - ./mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './mysqli.so' - ./mysqli.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './odbc.so' - ./odbc.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './pdo.so' - ./pdo.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './pdo_mysql.so' - ./pdo_mysql.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './pdo_odbc.so' - ./pdo_odbc.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Warning:  PHP Startup: Unable to load dynamic library './pdo_sqlite.so' - ./pdo_sqlite.so: cannot open shared object file: No such file or directory in Unknown on line 0
[05-May-2009 20:30:12] PHP Fatal error:  Call to undefined function mysql_connect() in /etc/parselog/stats_downloads.php on line 5

Tuttavia, quando eseguo lo stesso script dalla riga di comando, il login funziona perfettamente senza errori.

Questa è la mia stringa $ PATH al prompt:

$PATH = /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

Qualche idea o suggerimento? Sono certo che quando esegui il cronjob, non ha un percorso lib o qualcosa incluso. Ho anche provato ad aggiungere il percorso esatto

È stato utile?

Soluzione

Suggerimento 1: assicurati di avere esattamente lo stesso $ PATH nel processo cron:

cd /etc/parselog/
export PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin
php run_all.php >/dev/null

Suggerimento 2: assicurarsi che anche tutte le altre variabili di ambiente corrispondano. Scarica l'ambiente con il comando env e aggiungi le esportazioni corrispondenti al tuo processo cron.

Altri suggerimenti

Generalmente quando qualcosa non funziona durante cron ma viene eseguito sulla riga di comando sono permessi, directory di lavoro o variabili di ambiente.

Sembra che l'eseguibile php non stia caricando le librerie, il problema potrebbe non essere nel tuo script.

Quando si esegue uno script in un processo cron, questo viene eseguito in una shell limitata con pochissime variabili di ambiente impostate. Dai tuoi errori, sembra che potrebbe essere LD_LIBRARY_PATH che deve essere impostato come errori relativi a un gruppo di librerie condivise, ma è solo una supposizione. Sembra che i percorsi corretti della libreria per PHP non siano impostati correttamente nello script cron.

Puoi catturare l'ambiente usato quando esegui lo script cron aggiungendo il comando env allo script e catturando l'output. Confronta questo con l'output env al prompt e cerca le varianti. Molto probabilmente verranno dai comandi emessi nei file profilo o bashrc (o forse anche .login ) locali o di sistema che impostano la libreria percorsi. Cercherei specificamente percorsi e variabili relativi a PHP poiché questo sembra essere il tuo problema.

Ho dovuto affrontare questo problema diverse volte nel mio ultimo progetto e la soluzione di base è:

  1. determina l'ambiente minimo necessario per eseguire lo script
  2. crea uno script breve che imposta l'ambiente desiderato
  3. aggiungi una chiamata allo script dall'elemento 2 nello script che avvia le tue applicazioni in modo che l'ambiente sia impostato correttamente.
  4. Prova accuratamente per assicurarti di non perdere nulla :-).

Quando un cron job viene eseguito dal crontab degli utenti, viene eseguito come tale utente. Tuttavia non genera alcun file nella home directory degli utenti come il loro .profile, .cshrc o .bashrc o qualsiasi altro file. Se hai bisogno di cron per trovare (leggere) qualsiasi file di cui il tuo script avrà bisogno, dovresti farlo dallo script che sta chiamando cron. Impostazione di percorsi, approvvigionamento di file, impostazione di variabili di ambiente, ecc.

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