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?

War es hilfreich?

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ählen

In 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top