як встановити змінну 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 ..? Або ще краще - як додати до нього шляхи?

Відповіді:


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 або інші змінні середовища на щось особливе, він також включається у вашу команду.


Дякую, це пояснює це ... Але таким чином я можу встановити лише PATH, а не редагувати, тому що PATH = / sbin: $ PATH або подібне не працює. Я спробував ...
csny

Так, вам потрібно буде визначити PATH з нуля у такому випадку, який повинен бути досить простим, оскільки ви знаєте всі команди, які виконуються у вашій crontab, тому вам просто потрібно взяти їх до уваги.
квасоля

@madumlao bash -lcне допомагає. Я зараз добре налаштовую PATH вручну, але якщо я встановлю деякі сценарії, я хочу, щоб вони були розпізнані в cronjobs, не вказуючи повний шлях. Я впевнений, що це можливо якось і bash -lcє на шляху до рішення :)
csny

4
bash -lc запускає оболонку входу, яка джерела профілю вашого користувача. Це означає, що він використовує набір PATH у ~ / .bash_profile, ~ / .profile або ~ / .bashrc ... чи є у вас встановлений шлях? Якщо це так, і це працює погано, оновіть мою відповідь
madumlao

Чудово. Дякую Мадунлао. Після того, як я вручну додав папку бін-файлу до ~ / .bash_profile, мій cronjob працює добре.
张健健

8

Якщо вам потрібні системні PATHs та інші змінні ENV (які визначені в /etc/profile.d), просто поставте наступне:

* * * * * . /etc/profile; your cmd

3

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

З книг:

Активна лінія в crontab - це або налаштування середовища, або команда cron. Налаштування середовища має вигляд: name = значення, де пробіли навколо знака рівності (=) необов’язкові, а будь-які наступні непровідні білі проміжки у значенні є частиною значення, присвоєного імені. Рядок значень може бути розміщений у лапках (одинарних або подвійних, але збігаються), щоб зберегти пробіли чи пробіли.

Див. Для man 5 crontabотримання додаткової інформації.

Отже, це має працювати:

PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path

0

У мене була така ж проблема, і я знайшов інший спосіб запустити свій сценарій у crontab. Я думаю , що найпростіший спосіб запустити програму, щоб зробити скрипт , який міг кд в каталог програми. Потім зателефонуйте програмі в цьому сценарії.

це приклад сценарію (назва сценарію = 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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.