выполнение скрипта sh из cron

12

У меня есть скрипт test.sh

#!/bin/sh
php /home/v/file.php
sh /root/x/some.sh

когда я запускаю файл как root из командной строки, он работает.

sh /home/v/test.sh 

когда я устанавливаю его в crontab -e (это корневой cron), не работает

 * * * * * sh /home/v/test.sh

Что я делаю не так? Благодарность

Эльзо Валуги
источник
«не работает» не работает. Видеть? Вы не знаете, что я имею в виду, и мы не знаем, что вы имеете в виду. Я имею в виду (да), что не работает? Может быть о чем угодно. Может быть, предположение Тмоу верное, но это всего лишь предположение (и, думаю, довольно хорошее, но все же).
Юрген А. Эрхард
Да, если вы сможете более точно определить, какие результаты вы видите, мы сможем лучше определить, в чем заключается проблема. Т.е. что ты имеешь в виду "не работает" (:
gabe.
Я не вижу никакого журнала в системном журнале, и сценарии делают некоторые вставки в БД, чего не происходит, и они случаются, если я запускаю сценарий вручную.
Эльзо Валуги

Ответы:

15

По словам мужчины:

Демон cron запускает подоболочку из вашего каталога HOME. Если вы планируете запускать команду, когда вы не вошли в систему, и вы хотите, чтобы команды в вашем файле .profile выполнялись, команда должна явно прочитать ваш файл .profile.

Демон cron предоставляет среду по умолчанию для каждой оболочки, определяя HOME, LOGNAME, SHELL (= / usr / bin / sh)
и PATH (= / usr / bin).

Таким образом, демон cron не знает, где находится php, и вы должны указать полный путь php вручную, например (я не знаю ваш реальный путь PHP):

#!/bin/sh
/usr/local/bin/php /home/v/file.php
sh /root/x/some.sh

Другим способом является создание файла / etc / profile (или вашего .profile / .bashrc), например

* * * * * . /home/v/.bashrc ; sh /home/v/test.sh

Это полезно, если ваш .bashrc устанавливает переменные окружения, которые вам нужны (например, PATH)

РЕДАКТИРОВАТЬ

Интересное чтение - « Новичок: введение в cron », не стоит недооценивать статью из заголовка (это чтение для всех), на самом деле она хорошо написана завершена и идеально отвечает на ваш вопрос:

...
PATH содержит каталоги, которые будут в пути поиска для cron, например, если у вас есть программа 'foo' в каталоге / usr / cog / bin, возможно, стоит добавить / usr / cog / bin в путь, так как вам не придется использовать полный путь к 'foo' каждый раз, когда вы хотите вызвать его.
...

tmow
источник
Плохой $ PATH является наиболее распространенной причиной сценариев, которые работают вручную, но не из cron.
Патрик
@Patrick Конечно, это проблема, если cron не знает, где находится php, в противном случае crontab Elzo будет работать без проблем, это ДОЛЖНО быть проблема PATH.
tmow
Большое спасибо за ваш ответ. Это сработало для меня очень легко !!! .. Большое спасибо @tmow.
Виньеш Праджапати
5

Существует четыре распространенных причины для команд, работающих при вводе в терминале, но не в cron, в порядке общности:

  1. Cron предоставляет ограниченную среду, например, минимальную $PATH, а другие ожидаемые переменные отсутствуют.
  2. Cron по умолчанию вызывает / bin / sh, тогда как вы можете использовать другую оболочку в интерактивном режиме.
  3. Крон обрабатывает символ% специально (он превращается в новую строку в команде).
  4. Cron не предоставляет терминальную или графическую среду.

Если ваша работа выдает какие-либо выходные данные, включая сообщения об ошибках, cron отправляет вам электронное письмо со всем выводом. Убедитесь, что вы читаете почту, которую получаете локально, или пересылаете ее на адрес, который вы прочитали. Чтобы переслать почту с локальной учетной записи на другой адрес, введите другой адрес ~/.forward. Если задание хрон работают как пользователь системы ( root, webmaster, ...), убедитесь , что почта пользователя перенаправляются к вам (и любому другому администратору); с большинством настроек почты ставьте строки как root: elzoв /etc/aliases.

Жиль "ТАК - перестань быть злым"
источник
2

Демон cron обычно выполняет вашу команду в оболочке, где переменная окружения PATH ограничена каким-либо системным значением по умолчанию, например / usr / bin: / bin.

Вероятно, ваша phpкоманда недоступна в / usr / bin или / bin и, следовательно, скрипт завершается ошибкой при выполнении через cron и выполняется успешно, если нет.

Cron обычно сообщает об ошибках или сообщения о задании по почте пользователю root (т. Е. Когда команда возвращает состояние выхода! = 0 или выдает выходные данные в stdout / stderr) после завершения задания.

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

maxschlepzig
источник