Как установить cron PATH глобально (т.е. для всех пользователей) навсегда?

10

Нам нужно иметь / usr / local / bin в пути cron для всех пользователей. Есть ли способ установить его в масштабе всей системы, без необходимости редактировать crontab каждого отдельного пользователя?

Мы попытались добавить PATH в / etc / crontab:

# grep PATH /etc/crontab
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Но когда у пользователей есть это в их crontab:

$ crontab -l | grep PATH
* * * * * echo $PATH > /tmp/current_cron_path

... это показывает, что их путь по-прежнему установлен по умолчанию:

$ cat /tmp/current_cron_path
/usr/bin:/bin
грубее
источник
2
Общая подсказка: написание «это не сработало» обычно не даст вам полезного ответа. Всегда описывайте, как именно это не сработало, то есть, что именно вы делали, и каков был результат.
слеське
Обратите внимание, что полагаться на echoсвой cron, возможно, ненадежно .
Der Hochstapler

Ответы:

4

Вы можете настроить PATH в файле конфигурации crontab, как показано в первом коде, за исключением этого . Сначала укажите переменные env, затем укажите задания.

UPD: из-за того, что ссылка не работает, вот выдержка:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
igorp1024
источник
1
не работает на Ubuntu, даже после перезапуска Cron
Grosser
1
@grosser: Ну, это должно быть. Пожалуйста, опубликуйте свой полный crontab (отредактируйте свой ответ) вместе с выводом, который он производит, и почему вы считаете, что он не работает. Тогда посмотрим ...
слеське
Также обратите внимание, что формат строк VARIABLE = value несколько более ограничен, чем в сценарии оболочки: каждое назначение должно быть в отдельной строке, и вы не можете использовать переменные справа (например, PATH = $ ПУТЬ: / бла не будет работать).
слеське
я обновил вопрос, настройка PATH в отдельном crontab работала, просто глобальные изменения не работали
грубее
Попробуйте указать переменные PATH в каждом файле crontab, где вам это нужно. Вероятно, это сделано из-за проблем безопасности. Кстати, в Ubuntu (я проверял) PATH определяется в / etc / crontab и /etc/cron.d/anacron в Ubuntu. Похоже, что он не наследуется от / etc / crontab. Просто попробуйте определить его в crontab root ( sudo crontab -e)
igorp1024
1

Я не мог найти решение для этого либо. Наиболее близким к достойному решению является следующее (взято с https://raymii.org/s/tutorials/Better_cron_env_and_shell_control_with_the_SHELL_variale.html ).

  • Измените оболочку для вашего задания cron и укажите на сценарий bash. То есть, в верхней части cronjob, добавьте: SHELL=/path/to/setup/cron.bash
  • В этом сценарии оболочки загрузите переменные окружения и укажите другие переменные. Не забудьте включить следующие 4 строки вверху. Он сбрасывает переменную SHELL в bash и запускает оболочку bash для запуска cronjobs.

Например:

#!/bin/bash
set -e

source /etc/environment
source /etc/profile
# restore SHELL env var for cron
SHELL=/bin/bash

# execute the cron command in an actual shell
exec /bin/bash --norc "$@"

Недостаток: для этого необходимо указать SHELL=...верхнюю часть каждого cronjob. Перевернутая сторона: вы будете использовать обычные переменные окружения, и вам не придется беспокоиться о том, чтобы поддерживать постоянные переменные между cron и другими

Лорен Ритвельд
источник
0

Если вы можете быть пользователем root, можете ли вы попробовать отредактировать /etc/init.d/cronи изменить PATH там? Я не проверял это, но было бы интересно проверить.

Рич Гомолка
источник
не похоже на работу, я просто добавил PATH = xxx в /etc/init.d/cron, но вывод * * * * * echo $ PATH был таким же
грубее