Подтвердить что ты не робот

Crontab PATH и USER

Я новичок в планировании задач с помощью cron и crontab. Я пытаюсь запланировать выполнение задачи, как если бы я вошел в систему, открыл терминал и сам выполнил его.

Тем не менее, я назначил задачу, помогающую мне наблюдать, какие $USER и $PATH выполняет запланированное задание, и вот что я нашел:

$ crontab -l
41 11 * * * echo "USER: $USER" > ~/Desktop/cron_env.log; echo "PATH: $PATH" >> ~/Desktop/cron_env.log
$ cat ~/Desktop/cron_env.log
USER:
PATH: /usr/bin:/bin

Кажется, что $USER не установлен, а $PATH - это что-то очень основное и/или значение по умолчанию. Напротив, это то, что я вижу, когда открываю терминал (входит в систему) и повторяю эту же информацию:

USER: aschirma
PATH: /usr/lib/jvm/java-6-sun/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/pkg/icetools/bin:/pkg/hwtools/bin:/pkg/netscape/bin:/pkg/gnu/bin

Что мне нужно сделать, чтобы мои задачи crontab выполнялись так, как я хочу?

4b9b3361

Ответ 1

В соответствии с "man 5 crontab" вы можете установить переменные среды в своем crontab, написав их перед вашими линиями cron.

Существует также пример crontab, поэтому вам просто нужно его скопировать/вставить:

$ man 5 crontab | grep -C5 PATH | tail 
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow usercommand
17 * * * *  root  cd / && run-parts --report /etc/cron.hourly
25 6 * * *  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7  root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )

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

Ответ 2

В * ix процессы обычно наследуют среду от их родительского процесса через fork + exec. У них есть возможность очистить окружающую среду, но обычно они этого не делают. Вы можете увидеть дерево процессов с помощью ps axf, и вы можете увидеть переменные среды с помощью ps axfe.

cron обычно не является дочерним элементом какой-либо оболочки, поэтому у него часто будет другая среда из вашей интерактивной оболочки. Там хороший шанс cron будет намеренно очищать свою среду как-то от согласованности.

Мне нравится тестировать мои задания cron ( "foo" для обсуждения) со следующим в интерактивной оболочке: env -./foo Это фактически очистит больше env vars, что делает cron, но это облегчает получение информации об ИМО, поскольку то, что вы тестируете, более похоже. Вам нужно будет установить любые переменные, на которые вы зависите (например, $PATH), или заменить их чем-то другим - EG $USER становится $(whoami).

Мне также нравится писать сценарии bash для использования "set -eu" и "set -o pipefail". В "-eu" говорится "выйти из ненулевого кода выхода и выйти из ссылки на ссылку undefined", а pipefail говорит: "Не возвращайте последний код выхода в конвейере, вместо этого возвращайте первый код выхода, отличный от нуля, в трубопровод". В вашем случае набор -u может быть особенно полезен.

Ответ 3

Помните, что crontab - это демон или служба, так что это не похоже на вход пользователя или что-то в этом роде. Если вы хотите иметь переменные среды, вам нужно будет установить их самостоятельно. Однако большинство этих переменных задаются оболочкой из пути /etc/profile, а затем переходят в ваши пользовательские переменные в ваш каталог $HOME.

Возможно, вы сможете установить некоторые из них с помощью "sourcing" вашего /etc/profile, например:


41 11 * * * /home/<me>/cron_env.sh
Где cron_env.sh будет содержать что-то вроде:

#!/bin/sh
source /etc/profile
/usr/bin/env > /home/<me>/cron_env.log

Ответ 4

В нашей среде у нас обычно нет этой проблемы, так как root является единственным разрешенным cron, и каждая команда обычно запускается как пользователь, специфичный для приложения, VIA - команда su -c как:

su - myuser -c "/usr/local/scripts/app.sh" 2>&1

поскольку указан параметр "-", мы получаем профиль myuser и среду. У нас недавно возникла проблема с командой, которая потребовала права root для успешного завершения, поэтому мы просто выпустили команду без su -c. После некоторого исследования мы поняли, что самый простой способ получить корневую среду - использовать тот же метод для root, что и для всех других приложений, поэтому мы выпустили:

su - root -c "/usr/local/scripts/app.sh" 2>&1

Ответ 5

crontab не является bash script, вы не можете использовать переменные среды, которые обычно доступны в оболочке.

Попробуйте переместить весь этот код в файл script shebang'а (один начинается с строки "#!/bin/bash" ) и запустите script в crontab.

Я не уверен, но я думаю, что PATH (и, возможно, EMAIL, если вы его установили), может быть единственным, с которым вы можете получить доступ в файле crontab.

РЕДАКТИРОВАТЬ: Просмотрите справочную страницу crontab 5, существует немало переменных окружения, доступных всем cron daemon.