Jak uruchomić polecenie cron z istniejącymi zmiennymi środowiskowymi?
Jeśli pojawi się monit powłoki, mogę wpisać echo $ORACLE_HOME
i uzyskać ścieżkę. Jest to jedna z moich zmiennych środowiskowych, które są ustawione w mojej ~/.profile
. Jednak wydaje się, że ~/.profile
nie zostanie załadowane skrypty Fron crona i tak moje skrypty nie dlatego, że $ORACLE_HOME
zmienna nie jest ustawiona.
W tym pytaniu autor wspomina o utworzeniu ~/.cronfile
profilu, który konfiguruje zmienne dla crona, a następnie dokonuje obejścia, aby załadować wszystkie swoje polecenia crona do skryptów, które przechowuje w swoim ~/Cron
katalogu. Plik taki ~/.cronfile
wydaje się dobrym pomysłem, ale reszta odpowiedzi wydaje się trochę kłopotliwa i miałem nadzieję, że ktoś powie mi łatwiejszy sposób na uzyskanie tego samego rezultatu.
Przypuszczam, że na początku moich skryptów mógłbym dodać coś takiego, source ~/.profile
ale wydaje się, że może to być zbędne.
Więc jak mogę zmusić moje skrypty cron do ładowania zmiennych z mojego profilu powłoki interaktywnej?
source ~/.profile
do programu jest zbędne? Programy dziedziczą swoje środowisko po programie wywołującym. Jeśli ten program wywołujący nie jest twoją powłoką, to w jaki sposób program dekadujący uzyska pożądane środowisko?su -l
do skonfigurowania normalnego środowiska logowania, w tym $ PATH dla użytkownika root lub innego konkretnego użytkownika.Odpowiedzi:
W crontab, zanim wydasz polecenie, dodaj
. $HOME/.profile
. Na przykład:Cron
nic nie wie o twojej skorupie; jest uruchamiany przez system, więc ma minimalne środowisko. Jeśli chcesz czegoś, musisz mieć to przy sobie.źródło
.
przed skryptem? (nie jestem pewien, jak bym to zrobiłman
). Dlaczego to się różnisource
?.
Komenda jest oryginalny poleceniesource
. Są one równoważne w powłoce i nieco łatwiejsze do pisania, szczególnie w crontab. Aby uzyskać więcej informacji, wpiszhelp .
lub wyszukaj na^SHELL BUILTIN COMMANDS
stronie podręcznika dlabash
lub na górzeman
zshbuiltins. Running
wpisz .` powie ci, że polecenie jest wbudowane..profile
przez.bash_profile
. Sprawdź, który.profile
plik istnieje w katalogu osobistym użytkownika.Inną opcją, która jest dla mnie łatwiejsza, jest uruchomienie skryptu z cronem i włączenie środowiska w skrypcie.
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
/bin/bash
jako powłoki. Ciągle zastanawiałem się, dlaczego takie rzeczycd /path/to/project; source .vars
działałyby, gdyFile not found
wpisałem je ręcznie, ale zawiodły ( ), gdy zostały włączone do cronjob. Kluczową linią dla mnie było ustawienieSHELL=/bin/bash
tak, że mogłem używać znanych komend bash w każdym cronjobu./bin/sh/
(najwyraźniej domyślna powłoka crona) jest bardzo ograniczająca.EnvironmentFile
jednostkę serwisową. Szkoda, że cron nie ma czegoś podobnego.$SHELL
tak/bin/sh
,source
polecenie nie istnieje. Użyj.
zamiast tego.Inną opcją, którą uważam za łatwiejszą, jest uruchomienie skryptu za pomocą crona i nakazanie bashowi zalogowania się (stąd użycie
/etc/profile.d/...
definicji środowiska)W
crontab -e
pliku:Każde polecenie po źródle
.bash_profile
będzie miało środowisko tak, jakbyś się zalogował.źródło
Zły pomysł. Ogólna praktyka polega na konkretnym ustawianiu wszystkich wymaganych zmiennych środowiskowych w skrypcie, który ma być uruchamiany z zadania cron.
źródło
/usr/bin/env
polecenia, aby ustawić zmienne, a następnie może działać jako proces środowiskowy dla cronjob.envdir
przychodzi na myśl również Daemontools .~/.cronvars
i dołączyć go do profilu, a także do moich skryptów cron. Nie chcę na stałe kodować zmiennych środowiskowych w każdym ze skryptów, które uruchamiam, ponieważ kiedy ścieżki zmieniają się na stałe, ścieżki w każdym pliku nie są łatwe do utrzymania. Wygląda na to, że pozwoliłoby na scentralizowane miejsce na potrzebne zmienne i nadal zapobiegałoby ładowaniu innych zmiennych.Ta składnia zdecydowanie ci pomaga. Nie rozumiem składni, ale działa. Oracle używa tej składni podczas wdrażania Oracle Configuration Manager do crontab, dlatego uważam, że jest to właściwe rozwiązanie.
źródło
Niedawno natknąłem się na przypadek, w którym musiałem wykonać ogólny cronjob jako root, ale jednocześnie musiałem wykonać podkomendę jako inny użytkownik (co wymagało pozyskania środowiska tego użytkownika). Wybrałem następujące podejście:
Kluczową częścią jest
-i
przekazywany argument ,sudo
który wykona dane polecenie w osobnej powłoce logowania (co z kolei oznacza, że pliki dot użytkownika zostaną pozyskane).PS: Zauważ, że
user
kolumna jest dostępna tylko/etc/crontab
i/etc/cron.d/*
plików.źródło
Rozwiązanie, które dla mnie zadziałało, zostało opisane tutaj .
Tworzysz skrypt otoki, który wywołuje
. ~/.cronfile
, a następnie robi to, co chcesz. Ten skrypt jest uruchamiany przez crona.W
~/.cronfile
określasz środowisko dla twoich zadań cron.źródło
Tak, możesz użyć „dobrze znanych obejść” (z których kilka zostało wymienionych). Jest to kolejny sposób na powiedzenie, że wszyscy wiedzą, że jest to bzdura, chociaż niektórzy będą nazywać to „zabezpieczeniem”, ponieważ wydali co najmniej tyle samo potknięć o tę porażkę (ure), co ty, i chcieliby pomyśleć, że ich zmarnowany czas nie był niczym. Jest to odpowiednik cron klawiatury QWERTY.
Podejrzewam, że pierwotnym powodem mogła być wydajność, tak że skrypty uruchamiane raz na minutę nie spędzałyby czasu na czytaniu skryptów rc. Pierwotnie cron nie był tak naprawdę w ogóle konfigurowalny, więc domyślnie była naprawdę jedyną opcją.
Nie ma dodatkowego bezpieczeństwa, ponieważ nie ma prostej konfiguracji lub metody, aby cron po prostu przejął środowisko interaktywnej powłoki zamiast użytkowników wykonujących głupią gimnastykę. Na nowoczesnej maszynie generalnie nie ma zauważalnego wzrostu wydajności, chyba że co minutę wykonuje się ogromną liczbę zadań.
Kultura uniksowa zawodzi. Moim skromnym zdaniem. :-)
źródło
Dodaj
do crontab. Zobacz Jak zagwarantować dostępność $ BASH_ENV
źródło
Zamiast ustawiania profilu pomogło mi ustawienie
PATH
. Niektóre polecenia nie były dostępne w moich skryptach cron, ponieważPATH
są różne.PATH
Pomagało mi ustawienie ścieżki poleceń. Jeszcze lepiej, jeśli możesz użyć szablonu i później zdetatalizować,Przekazywanie zmiennych do każdego elementu wygląda na bałagan.
źródło
Włożyłem .
~/.dbus/session-bus/*
na górze mojego pożądanego skryptu :)źródło