как установить переменную PATH crontab

17

У меня была проблема с запуском скрипта из crontab. После некоторых исследований я понял, что проблема в том, что параметр PATH не включает / sbin.

Я посмотрел, что он включает в / etc / crontab:

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

В качестве теста - простое задание cron для печати переменной PATH:

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

выход:

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

Я не понимаю это поведение ... Как установить переменную PATH ..? Или лучше - как добавить к нему пути?

CSNY
источник

Ответы:

17

Хотя они похожи, пользовательский crontab (отредактированный с помощью crontab -e) отличается от системного crontab (и отредактировал его путем редактирования / etc / crontab) и сохраняет отдельный путь.

Системный crontab имеет 7 полей, вставляя имя пользователя перед командой. Пользовательский crontab, с другой стороны, имеет только 6 полей, которые вводятся непосредственно в команду сразу после полей времени.

Аналогично, PATH в системном crontab обычно включает каталоги / sbin, тогда как PATH в пользовательском crontab этого не делает. Если вы хотите установить PATH для пользовательского crontab, вам нужно определить переменную PATH в пользовательском crontab.


Простой обходной путь для добавления вашего обычного PATH в команды оболочки в cron состоит в том, чтобы сделать cronjob источником вашего профиля, запустив bash в оболочке входа в систему. например вместо

* * * * * some command

Вы можете вместо этого запустить

* * * * * bash -lc some command

Таким образом, если ваш профиль устанавливает переменную PATH или другие переменные окружения в нечто особенное, он также включается в вашу команду.

madumlao
источник
Спасибо, это объясняет ... Но таким образом я могу только установить PATH, но не редактировать, потому что PATH = / sbin: $ PATH или аналогичный не работает. Я пытался ...
csny
Да, вам нужно определить PATH с нуля в подобном случае, что должно быть достаточно просто, так как вы знаете все команды, которые запускаются в вашем crontab, поэтому вам просто нужно принять их во внимание.
бобы
@madumlao bash -lcне помогает. Сейчас у меня все хорошо с настройкой PATH вручную, но если я установлю некоторые скрипты, я хочу, чтобы они распознавались в cronjobs без указания полного пути. Я уверен, что это возможно как-то, и bash -lcнаходится на пути к решению :)
csny
4
bash -lc запускает оболочку входа в систему, которая является источником профиля вашего пользователя. Это означает, что он использует PATH, заданный в ~ / .bash_profile, ~ / .profile или ~ / .bashrc ... у вас там установлен путь? Если так, и это работает плохо, обновите мой ответ для этого
madumlao
Отлично. Спасибо Мадунлао. После того, как я вручную добавил папку bin в ~ / .bash_profile, мой cronjob работает хорошо.
张健健
8

Если вам нужны стандартные системные PATH и другие переменные ENV (которые определены в /etc/profile.d), просто добавьте следующее:

* * * * * . /etc/profile; your cmd
Владислав Савчук
источник
3

Можно установить PATH (или другие параметры) в строке cronjob или в одной строке. Но вы не можете использовать расширение оболочки, как PATH=$PATH:/usr/local/bin. Но тильда разрешена для ярлыков домашнего каталога.

Из книг:

Активная строка в crontab - это либо параметр среды, либо команда cron. Параметр среды имеет вид: имя = значение, в котором пробелы вокруг знака равенства (=) являются необязательными, а любые последующие не начальные пробелы в значении являются частью значения, назначенного для имени. Строка значения может быть помещена в кавычки (одинарные или двойные, но совпадающие), чтобы сохранить начальные или конечные пробелы.

Смотрите man 5 crontabдля получения дополнительной информации.

Так что это должно работать:

PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path
itsafire
источник
0

У меня была такая же проблема, и я нашел другой способ запустить мой скрипт в crontab. Я думаю , что самый простой способ запустить программу, чтобы сделать скрипт , который мог кд в каталог программы. Затем вызовите вашу программу в этом сценарии.

это пример скрипта (script name = launcher.sh):

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

затем сделайте ваш скрипт исполняемым:

chmod 755 launcher.sh

И наконец, добавьте ваш скрипт в crontab

crontab -e

и добавьте эту строку в конце:

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

(Я установил программу для запуска при каждой перезагрузке)

Рейхане Трб
источник