it-swarm.com.de

crontab PFAD und USER

Ich bin neu in der Planung von Aufgaben mit cron und crontab. Ich versuche, die Ausführung einer Aufgabe so zu planen, als hätte ich mich angemeldet, ein Terminal geöffnet und es selbst ausgeführt.

Ich habe jedoch eine Aufgabe geplant, die mir hilft zu beobachten, was mit $ USER und $ PATH eine geplante Aufgabe ausführt, und ich habe Folgendes gefunden:

$ crontab -l
41 11 * * * echo "USER: $USER" > ~/Desktop/cron_env.log; echo "PATH: $PATH" >> ~/Desktop/cron_env.log
$ cat ~/Desktop/cron_env.log
USER:
PATH: /usr/bin:/bin

Es sieht so aus, als sei $ USER nicht gesetzt, und $ PATH ist etwas sehr Grundlegendes und/oder Standard. Im Gegenteil, das sehe ich, wenn ich ein Terminal öffne (angemeldet bin) und diese Informationen wiederhole:

USER: aschirma
PATH: /usr/lib/jvm/Java-6-Sun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/pkg/icetools/bin:/pkg/hwtools/bin:/pkg/netscape/bin:/pkg/gnu/bin

Was muss ich tun, damit meine Crontab-Aufgaben so laufen, wie ich es möchte?

43
Adam S

Laut "man 5 crontab" können Sie Umgebungsvariablen in Ihrer crontab setzen, indem Sie sie vor Ihre cron-Zeilen schreiben.

Es gibt auch ein Beispiel für eine Crontab, also müssen Sie sie nur kopieren/einfügen:

$ man 5 crontab | grep -C5 PATH | tail 
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

Shell=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow usercommand
17 * * * *  root  cd / && run-parts --report /etc/cron.hourly
25 6 * * *  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )

So können Sie Ihren PATH oder eine beliebige Umgebungsvariable beliebig anpassen. Dieses Beispiel scheint jedoch für typische Fälle ausreichend zu sein.

73
Julien Palard

In * ix erben Prozesse normalerweise eine Umgebung von ihrem übergeordneten Prozess über Fork + exec. Sie haben die Möglichkeit, die Umgebung zu löschen, normalerweise aber nicht. Sie können den Prozessbaum mit ps axf und die Umgebungsvariablen mit ps axfe sehen.

cron ist normalerweise kein Kind der Shell einer anderen Person, daher hat es oft eine andere Umgebung als Ihre interaktive Shell. Es gibt eine gute Chance, dass cron seine Umgebung irgendwie absichtlich für Konsistenz freigibt.

Ich teste meine Cron-Jobs ("foo" zur Diskussion) mit folgendem in einer interaktiven Shell: Env - ./foo Dadurch werden zwar mehr env-vars gelöscht als bei cron, aber auch macht es einfacher, Dinge IMO zum Laufen zu bringen, da das, was Sie testen, ähnlicher ist. Sie müssen alle Variablen setzen, auf die Sie angewiesen sind (wie $ PATH), oder sie durch etwas anderes ersetzen - EG $ USER wird zu $ ​​(whoami).

Ich schreibe auch gerne meine Bash-Skripte, um "set -eu" und "set -o pipefail" zu verwenden. Das -eu sagt: "Exit-Code für einen Exit-Code ungleich Null und Exit für eine undefinierte Variablenreferenz", und die Pipefail sagt: "Den letzten Exit-Code in einer Pipeline nicht zurückgeben. Stattdessen den ersten Exit-Code in einer Pipeline zurückgeben. . In Ihrem Fall kann das Set -u besonders hilfreich sein.

15
user1277476

Denken Sie daran, dass Crontab ein Daemon oder ein Dienst ist, also nicht wie ein Benutzer angemeldet ist oder so. Wenn Sie Ihre Umgebungsvariablen haben möchten, müssen Sie diese selbst festlegen. Die meisten dieser Variablen werden jedoch von der Shell über den Pfad/etc/profile festgelegt und gehen dann in Ihre benutzerdefinierten Variablen in Ihr $ HOME-Verzeichnis. 

Möglicherweise können Sie einige von ihnen einstellen, indem Sie Ihr/etc/-Profil wie folgt angeben:

41 11 * * * /home/<me>/cron_env.sh
Wo cron_env.sh etwas enthält, wie:
#!/bin/sh
source /etc/profile
/usr/bin/env > /home/<me>/cron_env.log

4
Freddy

In unserer Umgebung ist dieses Problem normalerweise nicht vorhanden, da root der einzige zulässige Befehl ist und jeder Befehl normalerweise als anwendungsspezifischer Benutzer VIA und als su -c-Befehl ausgeführt wird:

su - myuser -c "/usr/local/scripts/app.sh" 2>&1

da die Option "-" angegeben ist, wird das Profil und die Umgebung des Benutzers angezeigt. Wir hatten kürzlich ein Problem mit einem Befehl, der die Berechtigung von root für den erfolgreichen Abschluss benötigte. Daher haben wir den Befehl nur ohne su -c ausgegeben. Nach einiger Recherche wurde uns klar, dass der einfachste Weg, die Umgebung von root zu erhalten, die gleiche Technik für root ist wie für alle anderen Anwendungen. 

su - root -c "/usr/local/scripts/app.sh" 2>&1
3

crontab ist kein Bash-Skript. Sie können keine Umgebungsvariablen verwenden, die normalerweise in einer Shell verfügbar sind.

Verschieben Sie den gesamten Code in eine Shebang-Skriptdatei (die mit der Zeile "#!/Bin/bash" beginnt) und führen Sie das Skript in der crontab aus.

Ich bin nicht sicher, aber ich denke, dass PATH (und vielleicht auch E-Mail, falls Sie es eingestellt haben) der einzige Zugriff auf die Crontab-Datei ist.

EDIT: Schauen Sie sich die Manpage crontab 5 an , dort sind einige Umgebungsvariablen verfügbar, die alle vom Cron-Daemon gesetzt werden.

0
KurzedMetal