Quali sono le differenze tra l'esecuzione di un eseguibile direttamente dalla riga di comando e un cron job in Linux?

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

  •  06-07-2019
  •  | 
  •  

Domanda

Ho questo eseguibile che richiede a un server remoto un comando, lo esegue sul computer locale e restituisce lo stdout (e forse anche lo stderr) da esso al server.

Questo eseguibile funziona bene se chiamato dalla riga di comando (come root), ma ho riscontrato che alcuni comandi non riescono quando vengono eseguiti automaticamente dal cron job.

Quali sono le differenze in termini di ambiente (utenti, stdin, stdout, ecc.) che dovrei aspettarmi quando pianifico questo eseguibile per eseguire periodicamente usando crontab?

Grazie!

È stato utile?

Soluzione

La differenza più importante è che file come .bashrc ecc. non vengono eseguiti prima dei cron job, quindi mancheranno molte variabili di ambiente che normalmente hai nella riga di comando. Quindi se il tuo programma non funziona nel cron job, incorporalo in uno script che imposta tutte le variabili d'ambiente necessarie.

Per quanto riguarda l'input e l'output, ovviamente non esiste alcuna interazione da parte dell'utente per i lavori cron, quindi i programmi non dovrebbero aspettarsi l'input (se lo fanno, fornirlo da un file di input o direttamente nello script) e qualsiasi output dovrebbe essere reindirizzato in un file di registro.

Altri suggerimenti

  

Questo eseguibile funziona bene se chiamato dalla riga di comando (come root), ma ho riscontrato che alcuni comandi non riescono quando vengono eseguiti automaticamente dal cron job.

Nei lavori cron puoi specificare quale utente deve eseguire lo script, ad esempio:

0 0 * * * www-data /usr/bin/php /var/www/foo/do_work.php

Sto specificando di eseguire 'do_work.php' come www-data ogni giorno ... Questo file si trova in /etc/cron.d/

Inoltre, dovresti probabilmente controllare l'UID che cron usa per eseguire le attività, specialmente se è un lavoro 'globale' / etc / crontab, non a livello di utente. Potrebbe essere che mancano alcune autorizzazioni se il lavoro è in esecuzione da "nobody" o "cron".

Principalmente

  • Directory di lavoro corrente: non è possibile garantire che cosa accadrà da cron. Potrebbe essere $ HOME, ma non contare su di esso
  • Variabili d'ambiente: la maggior parte che hai impostato per i normali accessi NON verrà impostata, quindi le cose che richiedono variabili d'ambiente con valori specifici potrebbero non riuscire. Ciò include in particolare $ PERCORSO.
  • stdin / stdout / stderr non sarà un tty, quindi alcuni programmi si comporteranno diversamente a causa di ciò (stdout ed err probabilmente saranno un file temporaneo; stdin sarà probabilmente nullo)

Ma essenzialmente non puoi fare affidamento su molto

  • ID utente, ID gruppo e gruppi supplementari devono essere impostati secondo un normale accesso per il proprietario del processo cron
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top