Чем отличается запуск исполняемого файла прямо из командной строки и от задания cron в Linux? - PullRequest
2 голосов
/ 24 октября 2009

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

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

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

Спасибо!

Ответы [ 4 ]

5 голосов
/ 24 октября 2009

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

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

2 голосов
/ 24 октября 2009

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

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

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

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

1 голос
/ 25 октября 2009

в основном

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

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

  • Идентификатор пользователя, идентификатор группы и дополнительные группы должны быть установлены в соответствии с обычным логином для владельца задания cron
1 голос
/ 24 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...