367 Stimmen

Wo kann ich Umgebungsvariablen setzen, die crontab verwenden soll?

Ich lasse jede Stunde einen Crontab laufen. Der Benutzer, der sie ausführt, hat Umgebungsvariablen in der Datei .bash_profile die funktionieren, wenn der Benutzer den Job vom Terminal aus ausführt, aber offensichtlich werden diese nicht von crontab übernommen, wenn es läuft.

Ich habe versucht, sie in .profile y .bashrc aber sie scheinen immer noch nicht abgeholt zu werden. Weiß jemand, wo ich Umgebungsvariablen einfügen kann, die von crontab übernommen werden können?

311voto

carestad Punkte 2956

Sie können Umgebungsvariablen in der Crontab selbst definieren, wenn Sie crontab -e über die Befehlszeile.

LANG=nb_NO.UTF-8
LC_ALL=nb_NO.UTF-8
# m h  dom mon dow   command

* * * * * sleep 5s && echo "yo"

Diese Funktion ist nur für bestimmte Implementierungen von cron verfügbar. Ubuntu und Debian verwenden derzeit vixie-cron die es erlaubt, diese in der crontab-Datei zu deklarieren (auch GNU mcron ).

Archlinux y RedHat verwenden. Kumpel die nicht lassen die Deklaration von Umgebungsvariablen nicht zu und führen zu Syntaxfehlern in der cron.log. Abhilfe kann pro Eintrag geschaffen werden:

# m h  dom mon dow   command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"

208voto

Vishal Punkte 2929

Ich habe eine weitere Lösung für dieses Problem:

0 5 * * * . $HOME/.profile; /path/to/command/to/run

In diesem Fall werden alle Umgebungsvariablen ausgewählt, die in Ihrer $HOME/.profile Datei.

Natürlich $HOME ebenfalls nicht gesetzt ist, müssen Sie ihn durch den vollständigen Pfad Ihrer $HOME .

128voto

Augusto Destrero Punkte 3645

Einstellung von Variablen in /etc/environment hat bei mir auch unter Ubuntu funktioniert. Ab 12.04 sind die Variablen in /etc/environment für Cron geladen werden.

96voto

Jonathan Leffler Punkte 694013

Lassen Sie "cron" ein Shell-Skript ausführen, das die Umgebung vor der Ausführung des Befehls einstellt.

Immer.

#   @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $
#   Crontab file for Home Directory for Jonathan Leffler (JL)
#-----------------------------------------------------------------------------
#Min     Hour    Day     Month   Weekday Command
#-----------------------------------------------------------------------------
0        *       *       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/hourly
1        1       *       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/daily
23       1       *       *       1-5     /usr/bin/ksh /work1/jleffler/bin/Cron/weekday
2        3       *       *       0       /usr/bin/ksh /work1/jleffler/bin/Cron/weekly
21       3       1       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/monthly

Die Skripte in ~/bin/Cron sind alle Links zu einem einzigen Skript, "runcron", das wie folgt aussieht:

:       "$Id: runcron.sh,v 2.1 2001/02/27 00:53:22 jleffler Exp $"
#
#       Commands to be performed by Cron (no debugging options)

#       Set environment -- not done by cron (usually switches HOME)
. $HOME/.cronfile

base=`basename $0`
cmd=${REAL_HOME:-/real/home}/bin/$base

if [ ! -x $cmd ]
then cmd=${HOME}/bin/$base
fi

exec $cmd ${@:+"$@"}

(Geschrieben nach einem älteren Codierungsstandard - heutzutage würde ich ein "#!" am Anfang verwenden).

Die "~/.cronfile" ist eine Variante meines Profils für die Verwendung durch cron - konsequent nicht-interaktiv und kein Echo um des Lärms willen. Sie könnten stattdessen das .profile und so weiter ausführen lassen. (Das REAL_HOME-Zeug ist ein Artefakt meiner Umgebung - Sie können so tun, als sei es dasselbe wie $HOME.)

Dieser Code liest also die entsprechende Umgebung und führt dann die Nicht-Cron-Version des Befehls aus meinem Heimatverzeichnis aus. Mein "Wochentag"-Befehl sieht also zum Beispiel so aus:

:       "@(#)$Id: weekday.sh,v 1.10 2007/09/17 02:42:03 jleffler Exp $"
#
#       Commands to be done each weekday

# Update ICSCOPE
n.updics

Der Befehl "daily" ist einfacher:

:       "@(#)$Id: daily.sh,v 1.5 1997/06/02 22:04:21 johnl Exp $"
#
#       Commands to be done daily

# Nothing -- most things are done on weekdays only

exit 0

92voto

breizhmg Punkte 861

Wenn Sie die Skripte, die Sie über cron ausführen, mit starten:

#!/bin/bash -l

Sie sollten Ihre Unterlagen abholen. ~/.bash_profile Umgebungsvariablen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X