Lassen Sie 'cron' ein Shell-Skript ausführen, das die Umgebung festlegt, bevor Sie den Befehl ausführen.
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 mit einem älteren Codierungsstandard - heutzutage würde ich am Anfang ein Shebang '#!' Verwenden.)
Das '~ / .cronfile' ist eine Variation meines Profils zur Verwendung durch cron - streng nicht interaktiv und kein Echo, um laut zu sein. Sie können stattdessen die Ausführung des .profile usw. veranlassen. (Das REAL_HOME-Zeug ist ein Artefakt meiner Umgebung - Sie können so tun, als wäre es dasselbe wie $ HOME.)
Dieser Code liest also die entsprechende Umgebung und führt dann die Nicht-Cron-Version des Befehls aus meinem Home-Verzeichnis aus. So sieht beispielsweise mein Befehl 'Wochentag' wie folgt 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 'täglich' 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
Ich habe noch eine Lösung für dieses Problem:
In diesem Fall werden alle in Ihrer
$HOME/.profile
Datei definierten Umgebungsvariablen ausgewählt .Natürlich
$HOME
ist auch nicht festgelegt, Sie müssen es durch den vollständigen Pfad Ihres ersetzen$HOME
.quelle
source ~/.bashrc
, und es stellt sich heraus, dass meine.bashrc
Datei in irgendeiner Weise mit dem Cron-Job in Konflikt steht. Wenn ich eine sehr einfache.env_setup_rc
Datei mit nur einer Zeile verwendeexport MY_ENV_VAR=my_env_val
:, funktioniert es tatsächlich. Siehe meinen Beitrag: stackoverflow.com/questions/15557777/…Das Einstellen von vars hat
/etc/environment
auch in Ubuntu für mich funktioniert. Ab 12.04 werden Variablen in/etc/environment
für cron geladen.quelle
env >> /etc/environment
und alle aktuellen Umgebungsvariablen sind jetzt in den CRON-Jobs verfügbar.env >> /etc/environment
Wird fehlschlagen, wenn in einer der Umgebungsvariablen ein Hash-Zeichen vorhanden ist. Es fiel mir am schwersten, meine Anwendung zu beheben. Es stellte sich heraus, dass es sich um ein Passwort mit '#' handelte, das bei diesem Schritt abgeschnitten wurde.Wenn Sie die Skripte starten, die Sie über cron ausführen, mit:
Sie sollten Ihre
~/.bash_profile
Umgebungsvariablen erfassenquelle
root
Crontab ausgeführt wird? Es gibt keinen/home/root
Ordner auf meinem System und daher sehe ich nicht, wie dies mitroot
Crontab funktionieren würde . Ideen?#!/bin/bash
. Die Magie hier ist hinzuzufügen-l
Das @ carestad-Beispiel zu erweitern, das ich einfacher finde, besteht darin, das Skript mit cron auszuführen und die Umgebung im Skript zu haben.
In der crontab -e Datei:
In der Datei cron_job.sh:
Jeder Befehl nach der Quelle von .bash_profile hat Ihre Umgebung so, als ob Sie angemeldet wären.
quelle
Für mich musste ich die Umgebungsvariable für eine PHP-Anwendung einstellen. Ich habe es wieder aufgenommen, indem ich den folgenden Code zu meiner Crontab hinzugefügt habe.
crontab:
und in doSomethingWonderful.php konnte ich den Umgebungswert erhalten mit:
Ich hoffe das hilft!
quelle
Was auch immer Sie eingestellt haben
crontab
wird in den Cronjobs sowohl direkt als auch unter Verwendung der Variablen in den Skripten verfügbar sein.Verwenden Sie sie in der Definition des Cronjobs
Sie können
crontab
so konfigurieren , dass Variablen festgelegt werden, die dann vom Cronjob verwendet werden können:Jetzt
/tmp/hello
zeigt die Datei Dinge wie:Verwenden Sie sie in dem von cronjob ausgeführten Skript
Sie können
crontab
so konfigurieren , dass Variablen festgelegt werden, die dann von den Skripten verwendet werden können:Und sagen Sie, das Skript
/tmp/myscript.sh
ist wie folgt:Es wird eine Datei generiert, die Folgendes
/tmp/myoutput.res
zeigt:quelle
Das Erweitern von @Robert Brisita wurde gerade erweitert. Wenn Sie nicht alle Variablen des Profils im Skript einrichten möchten, können Sie die zu exportierenden Variablen oben im Skript auswählen
In der crontab -e Datei:
In script.sh
quelle
Anstatt
Verwenden Sie bash -l -c
quelle
-l
Folgendes :#!/bin/bash -l
? Diese andere Antwort ist einfach und elegant.Ich verwende es
Oh-my-zsh
in meinem MacBook, also habe ich viele Dinge versucht, um die Crontab-Task.zshrc
zum Laufen zu bringen, aber schließlich stellte meine Lösung das vor dem Befehl auszuführende vor.Diese Aufgabe wird alle 30 Minuten ausgeführt und verwendet
.zshrc
Profil, um meinen Knotenbefehl auszuführen.Vergessen Sie nicht, den Punkt vor dem
$HOME
var zu verwenden.quelle
Eine andere Möglichkeit - inspiriert von dieser Antwort -, Variablen zu "injizieren", ist die folgende (Beispiel fcron):
Von
help set
:Also alles dazwischen
set -
undset +
wird exportiertenv
und ist dann für andere Skripte usw. verfügbar. Ohneset
die Variablen zu verwenden, werden sie bezogen, leben aber inset
nur in.Abgesehen davon ist es auch nützlich, Variablen zu übergeben, wenn für ein Programm ein Nicht-Root-Konto ausgeführt werden muss, Sie jedoch einige Variablen in der Umgebung dieses anderen Benutzers benötigen. Unten finden Sie ein Beispiel für die Übergabe von nullmailer-Variablen zum Formatieren des E-Mail-Headers:
quelle
Ich habe die meisten der bereitgestellten Lösungen ausprobiert, aber zunächst hat nichts funktioniert. Es stellt sich jedoch heraus, dass es nicht die Lösungen waren, die nicht funktionierten. Anscheinend
~/.bashrc
beginnt meine Datei mit dem folgenden Codeblock:Dies ist im Grunde genommen eine
case statement
Überprüfung der aktuellen Optionen in der aktuellen Shell, um festzustellen, ob die Shell interaktiv ausgeführt wird. Wenn die Shell zufällig interaktiv ausgeführt wird, wird mit der Beschaffung der~/.bashrc
Datei fortgefahren . In einer von aufgerufenen Shell enthältcron
die$-
Variable jedoch nicht deni
Wert, der auf Interaktivität hinweist. Daher wird die~/.bashrc
Datei nie vollständig bezogen. Infolgedessen wurden die Umgebungsvariablen nie festgelegt. Wenn dies Ihr Problem ist, können Sie den Codeblock wie folgt auskommentieren und es erneut versuchen:Ich hoffe, das wird nützlich
quelle
Sie können Ihrem Befehl auch voranstellen
env
, um Umgebungsvariablen wie folgt einzufügen :quelle