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?

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.


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

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

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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.