Wo kann ich Umgebungsvariablen, crontab verwenden?
-
19-09-2019 - |
Frage
habe ich eine crontab jede Stunde läuft. Der Benutzer läuft es Umgebung variabless im .bash_profile
hat, dass die Arbeit, wenn der Benutzer den Job aus dem Terminal läuft jedoch offensichtlich diese nicht von crontab abgeholt, wenn es ausgeführt wird.
Ich habe versucht, sie in .profile
und .bashrc
Einstellung, aber sie scheinen immer noch nicht zu abgeholt. Weiß jemand, wo ich Umgebung setzen kann Vars, dass crontab abholen können?
Lösung
Haben Sie ‚cron‘ laufen ein Shell-Skript, dass Sätze, die Umwelt, bevor der Befehl ausgeführt wird.
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 Verbindungen zu einem einzigen Skript, 'runcron', die aussieht wie:
: "$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 Standard Codierung -. Heute, würde ich eine shebang '! #' Verwenden zu Beginn)
Der ‚~ / .cronfile‘ ist eine Variation auf meinem Profil zur Verwendung von cron - rigoros nicht-interaktiven und ohne Echo aus Gründen der laut. Sie könnten ordnen die .profile und so weiter statt auszuführen. (Das REAL_HOME Zeug ist ein Artefakt meiner Umgebung -. Sie können so tun, als es die gleichen wie $ HOME)
So liest dieser Code die passende Umgebung und führt dann die nicht-Cron Version des Befehls aus meinem Home-Verzeichnis. So zum Beispiel, mein 'Wochentag' Befehl aussieht wie:
: "@(#)$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 'täglich' Befehl 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
Andere Tipps
Sie können sich Umgebungsvariablen in der crontab definieren, wenn crontab -e
von der Befehlszeile ausgeführt wird.
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. Ubuntu und Debian verwenden derzeit vixie-cron , die dies ermöglicht in der crontab-Datei deklariert werden (auch GNU mcron ).
Archlinux und RedHat Verwendung cronie die nicht erlauben Umgebungsvariablen deklariert werden und Syntaxfehler in der cron.log werfen. Abhilfe kann per-Eintrag vorgenommen werden:
# m h dom mon dow command
* * * * * export LC_ALL=nb_NO.UTF-8; sleep 5s && echo "yo"
bekam ich noch eine Lösung für dieses Problem:
0 5 * * * . $HOME/.profile; /path/to/command/to/run
In diesem Fall wird es alle die Umgebungsvariable in Ihrer $HOME/.profile
Datei definiert wählen.
Natürlich $HOME
ist auch nicht gesetzt ist, müssen Sie es mit dem vollständigen Pfad Ihres $HOME
ersetzen.
Einstellung Vars in /etc/environment
auch für mich in Ubuntu gearbeitet. Ab 12.04 Variablen in /etc/environment
für cron geladen.
Die Erweiterung auf @carestad Beispiel, das ich einfacher finden, ist das Skript mit cron und haben die Umgebung im Skript auszuführen.
In crontab -e-Datei:
SHELL=/bin/bash
*/1 * * * * $HOME/cron_job.sh
In cron_job.sh Datei:
#!/bin/bash
source $HOME/.bash_profile
some_other_cmd
Jeder Befehl nach der Quelle der Bash_profile Ihre Umgebung hat, als ob Sie angemeldet.
Wenn Sie die Skripte, die Sie ausführen durch cron mit starten:
#!/bin/bash -l
Sie sollten Ihre ~/.bash_profile
Umgebungsvariablen aufheben
Für mich ich die Umgebungsvariable für eine PHP-Anwendung zu setzen hatte. Ich resloved es indem Sie den folgenden Code in meine crontab.
$ sudo crontab -e
crontab:
ENVIRONMENT_VAR=production
* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php
und innerhalb doSomethingWonderful.php ich den Umgebungswert bekommen könnte mit:
<?php
echo $_SERVER['ENVIRONMENT_VAR']; # => "production"
Ich hoffe, das hilft!
Wie auch immer setzen Sie in crontab
wird in dem Cronjobs, sowohl direkt als auch über die Variablen in den Skripten zur Verfügung.
sie in der Definition der Verwendung cronjob
Sie können crontab
so konfigurieren, dass es Variablen setzt, die dann die Verwendung CronJob kann:
$ crontab -l
myvar="hi man"
* * * * * echo "$myvar. date is $(date)" >> /tmp/hello
Nun ist die Datei /tmp/hello
zeigt Dinge wie:
$ cat /tmp/hello
hi man. date is Thu May 12 12:10:01 CEST 2016
hi man. date is Thu May 12 12:11:01 CEST 2016
sie im Skript läuft Verwenden von cronjob
Sie können crontab
so konfigurieren, dass es Variablen setzt, die dann können die Skripte verwenden:
$ crontab -l
myvar="hi man"
* * * * * /bin/bash /tmp/myscript.sh
Und sagen Skript /tmp/myscript.sh
ist wie folgt aus:
echo "Now is $(date). myvar=$myvar" >> /tmp/myoutput.res
Es erzeugt eine Datei /tmp/myoutput.res
zeigt:
$ cat /tmp/myoutput.res
Now is Thu May 12 12:07:01 CEST 2016. myvar=hi man
Now is Thu May 12 12:08:01 CEST 2016. myvar=hi man
...
Anstelle von
0 * * * * sh /my/script.sh
Mit bash -l -c
0 * * * * bash -l -c 'sh /my/script.sh'
Als Erweiterung @ Robert Brisita hat gerade erweitern, auch wenn Sie nicht möchten, dass alle Variablen des Profils im Skript einrichten, können Sie die Variablen für den Export auf dem Anfang des Skripts
wählenIn crontab -e-Datei:
SHELL=/bin/bash
*/1 * * * * /Path/to/script/script.sh
In script.sh
#!/bin/bash
export JAVA_HOME=/path/to/jdk
some-other-command
Eine andere Art und Weise - inspiriert von dieser diese Antwort - auf "Inject" Variablen ist die folgende (fcron Beispiel):
%daily 00 12 \
set -a; \
. /path/to/file/containing/vars; \
set +a; \
/path/to/script/using/vars
Von help set
:
-a Mark Variablen, die geändert oder für den Export hergestellt.
Mit + statt -. Verursacht diese Flags ausgeschaltet werden
Also alles, was dazwischen set -
und set +
wird zu env
exportiert und ist dann für andere Skripte usw. Ohne Verwendung set
die Variablen Quellen erhalten, aber leben in set
nur.
von Abgesehen, dass es auch nützlichen Variablen zu übergeben, wenn ein Programm ein nicht-root-Konto erfordert zu laufen, aber Sie würden einige Variablen in dieser anderen Benutzerumgebung benötigen. Im Folgenden wird ein Beispiel in nullmailer vorbei Vars die E-Mail-Header-Format:
su -s /bin/bash -c "set -a; \
. /path/to/nullmailer-vars; \
set +a; \
/usr/sbin/logcheck" logcheck
habe ich versucht, die meisten der angebotenen Lösungen, aber nichts funktionierte zunächst. Es stellt sich heraus, aber, dass es nicht die Lösungen, die Arbeit gescheitert. Offenbar beginnt meine ~/.bashrc
Datei mit dem folgenden Code-Block:
case $- in
*i*) ;;
*) return;;
esac
Dies ist im Grunde ein case statement
, dass überprüft den aktuellen Satz von Optionen in dem aktuell Shell, um festzustellen, dass die Shell interaktiv ausgeführt wird.
Wenn die Shell interaktiv ausgeführt werden, geschieht, dann geht es um die Beschaffung der ~/.bashrc
-Datei auf.
Jedoch in einer Schale durch cron
aufgerufen, die $-
Variable enthält nicht den i
Wert, die Interaktivität anzeigt.
Daher wird die ~/.bashrc
Datei nie vollständig bezogen. Als Ergebnis wurde die Umgebungsvariablen nie eingestellt.
Wenn dies geschieht, um Ihr Problem zu sein, können Sie den Codeblock kommentieren wie folgt und versuchen Sie es erneut:
# case $- in
# *i*) ;;
# *) return;;
# esac
Ich hoffe Dies erweist sich als nützlich
Ich verwende Oh-my-zsh
in meinem macbook so dass ich viele Dinge ausprobiert habe die crontab Task ausgeführt zu bekommen, aber schließlich meine Lösung wurde vorangestellten .zshrc
vor dem Befehl ausgeführt werden soll.
*/30 * * * * . $HOME/.zshrc; node /path/for/my_script.js
Diese Aufgabe fährt alle 30 Minuten und Anwendungen .zshrc
Profil mein Knoten Befehl auszuführen.
Vergessen Sie nicht, den Punkt vor dem $HOME
var zu verwenden.