Domanda

Quando si esegue uno script con cron, qualsiasi eseguibile chiamato dentro deve avere il percorso completo. Ho scoperto questo tentativo di eseguire wondershaper , quando sono stati mostrati molti errori quando si è tentato di chiamare tc. Quindi la mia domanda è: qual è il modo corretto di superare questo problema?

Possibili soluzioni:

  • cd nella cartella degli eseguibili e prepara collegamenti simbolici a qualsiasi altro eseguibile chiamato lì (non sono sicuro che funzioni - bassa portabilità)
  • usa percorsi completi nello script (funziona - bassa portabilità in diverse distro)
  • esportazione di una variabile di percorso con i percorsi necessari all'interno dello script (non sono sicuro che funzioni)

Bene, grazie in anticipo per chiunque abbia aiutato.

È stato utile?

Soluzione

Dichiarare le variabili all'interno del tuo cron job è più esplicito e più facile da mantenere: tutto ciò che devi modificare è contenuto nel tuo cron job e non devi trasferire più file se dovessi spostarlo su un altro sistema.

PATH=/usr/bin:/your/fancy/dir
MYAPPROOT=/var/lib/myapp

*/2 * * * * myappinpath
*/3 * * * * $MYAPPROOT/mylocalapp

Altri suggerimenti

Se sei su linux / bsd / mac puoi impostare alcune variabili d'ambiente come PATH proprio nel crontab , e con ciò sei generalmente pronto per partire .

Se sei su Solaris, bene, prego per te. Ma ho anche una risposta: generalmente cerco .profile prima di eseguire qualsiasi cosa:

0 0 * * 0 . /home/myuser/.profile && cd /path && ./script

Intendiamoci, il mio .profile carica .bash_profile e .bashrc . Basta essere sicuri che qualunque file tu abbia sorgente di ciò che ti serve.

Poiché cron non esegue il login, .profile e / etc / profile non provengono. Pertanto PATH potrebbe non essere impostato su un valore previsto. Vorrei

  • imposta ed esporta PATH su un valore appropriato
  • usa percorsi completi nello script

Presuppone il tuo trucco con collegamenti simbolici. è nel PERCORSO e non sembra carino

La mia raccomandazione:

Imposta tutte le variabili in un file esterno. Uso il file 'process_name.env' che si trova in / etc / process_name o simile. Immagina di avere uno script di backup. Quindi tu:

  • Crea /etc/backup.env e metti tutte le variabili d'ambiente necessarie per eseguire il "backup" compito.
  • Modifica lo script di backup e aggiungi questa riga dopo Shebang :

    . /etc/backup.env #C'è un punto e uno spazio prima del percorso completo per l'ambiente di backup.

IMO questo approccio è meglio che dichiarare variabili nelle definizioni CRON perché:

  • Facile da mantenere. Basta modificare un file.
  • Facile da cambiare configurazione / configurazione centralizzata:
    • Puoi avere .env multipli per utilizzare lo script in diverse situazioni (ad esempio, considera di avere posizioni di backup sul tuo .env, puoi passare la posizione .env come argomento ed eseguire il tuo lavoro cron quotidianamente fornendo un .env con alcune posizioni e settimanalmente con posizioni diverse fornendo un altro .env, solo un esempio).
  • Puoi conservare i tuoi file .env in un VCS come SVN o Git.
  • Molto facile testare i tuoi script (non è necessario eseguirlo da CRON).

Saluti

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