jak ustawić zmienną PATH crontab

17

Miałem problem z uruchomieniem skryptu z crontab. Po kilku badaniach zrozumiałem, że problem polegał na tym, że parametr PATH nie zawiera / sbin.

Spojrzałem, co to zawiera w / etc / crontab:

PATH=/sbin:/bin:/usr/sbin:/usr/bin

Jako test - proste zadanie crona do wydrukowania zmiennej PATH:

* * * * * echo $PATH &> /root/TMP.log

dane wyjściowe to:

cat /root/TMP.log
/usr/bin:/bin

Nie rozumiem tego zachowania ... Jak ustawić zmienną PATH ..? Lub lepiej - jak dodać do niego ścieżki?

csny
źródło

Odpowiedzi:

17

Mimo że są one podobne, crontab użytkownika (edytowany przy użyciu crontab -e) różni się od i zachowuje oddzielną ścieżkę od crontab systemowego (edytowanego przez edycję / etc / crontab).

Systemowy plik crontab ma 7 pól, wstawiając nazwę użytkownika przed poleceniem. Z drugiej strony użytkownik crontab ma tylko 6 pól, które przechodzą bezpośrednio do polecenia natychmiast po polach czasu.

Podobnie PATH w systemie crontab zwykle zawiera katalogi / sbin, podczas gdy PATH w crontabie użytkownika nie. Jeśli chcesz ustawić PATH dla crontab użytkownika, musisz zdefiniować zmienną PATH w crontab użytkownika.


Prostym obejściem dodawania zwykłej ŚCIEŻKI do poleceń powłoki w cron jest udostępnienie twojego profilu przez cronjob poprzez uruchomienie bash w powłoce logowania. na przykład zamiast

* * * * * some command

Zamiast tego możesz biegać

* * * * * bash -lc some command

W ten sposób, jeśli Twój profil ustawi PATH lub inne zmienne środowiskowe na coś specjalnego, zostanie również uwzględniony w twoim poleceniu.

madumlao
źródło
Dzięki, to wyjaśnia ... Ale w ten sposób mogę tylko ustawić PATH, a nie edytować, ponieważ PATH = / sbin: $ PATH lub podobny nie działa. Próbowałem ...
csny
Tak, musisz zdefiniować ŚCIEŻKĘ od zera w takim przypadku, co powinno być dość łatwe, ponieważ znasz wszystkie polecenia uruchamiane na twoim crontabie, więc musisz je wziąć pod uwagę.
fasola
@madumlao bash -lcnie pomaga. Na razie jestem dobry z ręcznym ustawieniem PATH, ale jeśli zainstaluję niektóre skrypty, chcę, aby były rozpoznawane w cronjobs bez podawania pełnych ścieżek. Jestem pewien, że jest to możliwe i bash -lcjest w drodze do rozwiązania :)
csny
4
bash -lc uruchamia powłokę logowania, która pozyskuje profil twojego użytkownika. Oznacza to, że korzysta z PATH ustawionego w ~ / .bash_profile, ~ / .profile lub ~ / .bashrc ... czy masz tam ustawioną ścieżkę? Jeśli tak, to działa źle, zaktualizuj moją odpowiedź na to
madumlao
Świetny. Dzięki Madunlao. Po ręcznym dodaniu folderu plików bin do ~ / .bash_profile mój cronjob działa dobrze.
张健健
8

Jeśli potrzebujesz domyślnych zmiennych systemowych PATH i innych zmiennych ENV (które zdefiniowano w /etc/profile.d), po prostu wstaw następujące informacje:

* * * * * . /etc/profile; your cmd
Vladislav Savchuk
źródło
3

Możliwe jest ustawienie PATH (lub innych parametrów) w linii cronjob lub w pojedynczej linii. Ale nie możesz używać rozszerzenia powłoki jak PATH=$PATH:/usr/local/bin. Ale tylda jest dozwolona w przypadku skrótów do katalogu domowego.

Z książek:

Aktywna linia w crontab jest ustawieniem środowiska lub poleceniem cron. Ustawienie środowiska ma postać: nazwa = wartość, gdzie białe spacje wokół znaku równości (=) są opcjonalne, a wszelkie kolejne nieprzedstawne białe spacje w wartości są częścią wartości przypisanej do nazwy. Ciąg wartości może być umieszczony w cudzysłowie (pojedynczy lub podwójny, ale pasujący), aby zachować wiodące lub końcowe białe spacje.

Zobacz man 5 crontabpo więcej informacji.

To powinno działać:

PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path
itsafire
źródło
0

Miałem ten sam problem i znalazłem inny sposób na uruchomienie skryptu w crontab. Myślę, że najłatwiejszym sposobem na uruchomienie programu jest stworzenie skryptu, który mógłby cd do katalogu twojego programu. Następnie wywołaj swój program w tym skrypcie.

to jest przykład skryptu (nazwa skryptu = launcher.sh):

#!bin/bash
cd /home/pi/test
sudo python3 example.py

następnie uczyń skrypt wykonalnym:

chmod 755 launcher.sh

I wreszcie dodaj swój skrypt do crontab

crontab -e

i dodaj tę linię na końcu:

@reboot sh /home/pi/test/launcher.sh

(Ustawiam program do uruchamiania przy każdym ponownym uruchomieniu)

Reyhaneh Trb
źródło