Niech „cron” uruchomi skrypt powłoki, który ustawia środowisko przed uruchomieniem polecenia.
Zawsze.
# @(#)$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
Wszystkie skrypty w ~ / bin / Cron są linkami do jednego skryptu „runcron”, który wygląda następująco:
: "$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 ${@:+"$@"}
(Napisane przy użyciu starszego standardu kodowania - w dzisiejszych czasach na początku używałbym przekreślenia „#!”).
„~ / .Cronfile” to odmiana w moim profilu do użytku przez crona - rygorystycznie nieinteraktywna i bez echa ze względu na bycie głośnym. Zamiast tego możesz skonfigurować plik .profile i tak dalej. (Rzeczy REAL_HOME to artefakt mojego środowiska - możesz udawać, że jest taki sam jak $ HOME.)
Tak więc ten kod odczytuje odpowiednie środowisko, a następnie wykonuje wersję polecenia inną niż Cron z mojego katalogu domowego. Na przykład moje polecenie „dzień tygodnia” wygląda następująco:
: "@(#)$Id: weekday.sh,v 1.10 2007/09/17 02:42:03 jleffler Exp $"
#
# Commands to be done each weekday
# Update ICSCOPE
n.updics
Polecenie „codzienne” jest prostsze:
: "@(#)$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
Mam jeszcze jedno rozwiązanie tego problemu:
W takim przypadku wybierze wszystkie zmienne środowiskowe zdefiniowane w
$HOME/.profile
pliku.Oczywiście
$HOME
również nie jest ustawiony, musisz zastąpić go pełną ścieżką$HOME
.źródło
source ~/.bashrc
i okazuje się, że mój.bashrc
plik jest w pewnym sensie sprzeczny z zadaniem cron. Jeśli użyję bardzo prostego.env_setup_rc
pliku z tylko jedną linią:export MY_ENV_VAR=my_env_val
to faktycznie działa. Zobacz mój post: stackoverflow.com/questions/15557777/...Ustawienie vars
/etc/environment
również działało dla mnie w Ubuntu. Od 12.04 zmienne/etc/environment
są ładowane dla crona.źródło
env >> /etc/environment
a wszystkie bieżące zmienne środowiskowe są teraz dostępne w zadaniach CRON.env >> /etc/environment
nie powiedzie się, jeśli w jednej ze zmiennych środowiskowych znajduje się znak skrótu. Trudno mi było rozwiązać problem z aplikacją. Okazało się, że jest to hasło zawierające „#”, które na tym etapie zostało obcięte.Jeśli uruchamiasz skrypty, które wykonujesz za pomocą crona:
Powinny wybrać twoje
~/.bash_profile
zmienne środowiskoweźródło
root
crontab? W/home/root
moim systemie nie ma folderu, więc nie widzę, jak to by działało zroot
crontabem. Pomysły?#!/bin/bash
. Magia polega na dodaniu-l
Rozwijając przykład @carestad, który jest dla mnie łatwiejszy, można uruchomić skrypt za pomocą crona i mieć w nim środowisko.
W pliku crontab -e:
W pliku cron_job.sh:
Każde polecenie po źródle pliku .bash_profile będzie miało środowisko tak, jakbyś się zalogował.
źródło
Dla mnie musiałem ustawić zmienną środowiskową dla aplikacji php. Przesadziłem go, dodając następujący kod do mojego pliku crontab.
crontab:
i wewnątrz doSomethingWonderful.php Mógłbym uzyskać wartość środowiska za pomocą:
Mam nadzieję, że to pomoże!
źródło
Cokolwiek ustawisz,
crontab
będzie dostępne w cronjobs, zarówno bezpośrednio, jak i przy użyciu zmiennych w skryptach.Użyj ich w definicji współdziałania
Możesz skonfigurować
crontab
tak, aby ustawiał zmienne, z których następnie może korzystać cronjob:Teraz plik
/tmp/hello
pokazuje takie rzeczy jak:Użyj ich w skrypcie prowadzonym przez cronjob
Możesz skonfigurować
crontab
tak, aby ustawiał zmienne, których następnie mogą używać skrypty:Powiedzmy, że skrypt
/tmp/myscript.sh
wygląda tak:Generuje plik
/tmp/myoutput.res
pokazujący:źródło
Rozwijanie w @Robert Brisita właśnie się rozszerzyło, również jeśli nie chcesz konfigurować wszystkich zmiennych profilu w skrypcie, możesz wybrać zmienne do wyeksportowania na górze skryptu
W pliku crontab -e:
W script.sh
źródło
Zamiast
Użyj bash -l -c
źródło
-l
postać#!/bin/bash -l
:? Ta inna odpowiedź jest prosta i elegancka.Używam
Oh-my-zsh
w moim Macbooku, więc próbowałem wielu rzeczy, aby uruchomić zadanie crontab, ale w końcu moim rozwiązaniem było przygotowanie.zshrc
przed uruchomieniem polecenia.To zadanie jest uruchamiane co 30 minut i używa
.zshrc
profilu do wykonania polecenia węzła.Nie zapomnij użyć kropki przed
$HOME
var.źródło
Innym sposobem - zainspirowanym tą odpowiedzią - na „wstrzyknięcie” zmiennych jest następujący (przykład fcron):
Od
help set
:Tak więc wszystko pomiędzy
set -
iset +
zostaje wyeksportowane doenv
i jest następnie dostępne dla innych skryptów itp. Bez użyciaset
zmiennych pozyskiwane są źródła, ale żyjąset
tylko w.Poza tym przydatne jest również przekazywanie zmiennych, gdy program wymaga konta innego niż root, ale potrzebujesz zmiennych w środowisku innego użytkownika. Poniżej znajduje się przykład przekazywania przez zmienne nullmailer do formatowania nagłówka wiadomości e-mail:
źródło
Próbowałem większości dostarczonych rozwiązań, ale na początku nic nie działało. Okazuje się jednak, że to nie rozwiązania nie działały. Najwyraźniej mój
~/.bashrc
plik zaczyna się od następującego bloku kodu:Zasadniczo jest to
case statement
sprawdzanie bieżącego zestawu opcji w bieżącej powłoce w celu ustalenia, czy powłoka działa interaktywnie. Jeśli powłoka działa interaktywnie, przechodzi do pobierania~/.bashrc
pliku. Jednakże, powłoka wywołana przezcron
The$-
zmienna nie zawierai
wartość, która wskazuje, interaktywność. Dlatego~/.bashrc
plik nigdy nie jest w pełni pozyskiwany. W rezultacie zmienne środowiskowe nigdy nie zostały ustawione. Jeśli to jest twój problem, skomentuj blok kodu w następujący sposób i spróbuj ponownie:Mam nadzieję, że okaże się to przydatne
źródło
Możesz również poprzedzić polecenie,
env
aby wstrzyknąć zmienne środowiskowe, takie jak:źródło