В чем разница между запуском исполняемого файла прямо из командной строки и из задания cron в Linux?

StackOverflow https://stackoverflow.com/questions/1618238

  •  06-07-2019
  •  | 
  •  

Вопрос

У меня есть исполняемый файл, который запрашивает команду на удаленном сервере, выполняет ее на локальном компьютере и возвращает стандартный вывод (а также, возможно, стандартный поток ошибок) с него обратно на сервер.

Этот исполняемый файл работает нормально, если его вызвать из командной строки (от имени пользователя root), но я обнаружил, что он не работает для некоторых команд при автоматическом выполнении задания cron.

Каковы различия с точки зрения среды (пользователи, стандартный ввод, стандартный вывод и т. д.) мне следует ожидать при планировании периодического запуска этого исполняемого файла с помощью crontab?

Спасибо!

Это было полезно?

Решение

Самое важное отличие заключается в том, что такие файлы, как .bashrc и т. д.не выполняются перед заданиями cron, поэтому многие переменные среды, которые обычно есть в командной строке, будут отсутствовать.Поэтому, если ваша программа не работает в задании cron, встройте ее в скрипт, который устанавливает все необходимые переменные среды.

Что касается ввода и вывода, то очевидно, что при выполнении заданий cron взаимодействие с пользователем не осуществляется, поэтому программы не должны ожидать ввода (если они это делают, предоставляйте его из входного файла или непосредственно в сценарии), а любой вывод должен быть перенаправлен в файл журнала. .

Другие советы

Этот исполняемый файл работает нормально, если его вызвать из командной строки (от имени пользователя root), но я обнаружил, что он не работает для некоторых команд при автоматическом выполнении задания cron.

В заданиях cron вы можете указать, под каким пользователем запускать скрипт, например:

0 0 * * * www-data /usr/bin/php /var/www/foo/do_work.php

Я указываю запускать do_work.php как www-данные каждый день...Этот файл будет расположен в /etc/cron.d/

Кроме того, вам, вероятно, следует проверить UID, который cron использует для запуска задач, особенно если это «глобальное» задание /etc/crontab, а не задание уровня пользователя.Возможно, некоторые разрешения отсутствуют, если задание выполняется от «никого» или «cron».

В основном

  • Текущий рабочий каталог — вы не можете гарантировать, что это будет из cron.Это может быть $HOME, но не рассчитывайте на это.
  • Переменные среды — большая часть того, что вы настроили для обычного входа в систему, НЕ будет установлена, поэтому вещи, которые требуют, чтобы переменные среды имели определенные значения, могут потерпеть неудачу.В частности, это включает $PATH.
  • stdin/stdout/stderr не будет tty, поэтому некоторые программы из-за этого будут вести себя по-другому (stdout и err, вероятно, будут временным файлом;стандартный ввод, вероятно, будет нулевым)

Но, по сути, на многое нельзя положиться.

  • Идентификатор пользователя, идентификатор группы и дополнительные группы должны быть установлены в соответствии с обычным входом в систему для владельца задания cron.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top