Cron выполнен, но скрипт не работает

Я знаю, что есть много похожих вопросов, и я пробовал много вещей, но все еще не могу заставить его работать.

У меня есть cronjob, который запланирован на 10 минут. Я вижу в /var/log/syslog, что он запускается нормально

Oct 21 07:30:01 stan CRON[7604]: (stan) CMD (stan /home/stan/update.sh)
Oct 21 07:40:01 stan CRON[8304]: (stan) CMD (stan /home/stan/update.sh)
Oct 21 07:50:01 stan CRON[8751]: (stan) CMD (stan /home/stan/update.sh)
Oct 21 08:00:01 stan CRON[9347]: (stan) CMD (stan /home/stan/update.sh)
Oct 21 08:10:01 stan CRON[9789]: (stan) CMD (stan /home/stan/update.sh)

update.sh вызывает php скрипт, который обновляет базу данных. Когда я запускаю непосредственно с терминала, база данных сценария оболочки обновилась, и она отлично работает

./update.sh

Но из cronjob не обновляется база данных. Мой cron

*/10 * * * * stan /home/stan/update.sh

Команда, созданная из сценария оболочки, является

/usr/bin/php /var/www/html/site/update.php

Разрешения обоих файлов

-rwxrwxr-x  1 stan stan    123 Oct 20 15:09 update.sh
-rwxr-xr-x  1 stan www-data 1301 Oct 21 07:52 /var/www/html/site/update.php

Любая идея в чем может быть проблема?

Обновление: PATH

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

update.sh

$ cat update.sh 
#!/bin/sh

list="/var/www/html/site"
config="/usr/bin/php"

for i in "$list"
do
    "$config" "$i"/update.php
done

Ссылка на мой вопрос со вчерашнего дня, который был о оболочке и php, теперь о cron.

$ whereis php

php: /usr/bin/php5.6 /usr/bin/php /usr/lib/php /etc/php /usr/include/php /usr/share/php5.6-intl /usr/share/php7.0-mbstring /usr/share/php7.0-common /usr/share/php5.6-curl /usr/share/php5.6-gd /usr/share/php5.6-mcrypt /usr/share/php5.6-common /usr/share/php5.6-readline /usr/share/php5.6-json /usr/share/php /usr/share/php5.5-mbstring /usr/share/php5.6-opcache /usr/share/php5.6-mbstring /usr/share/php5.6-xml /usr/share/php5.5-common /usr/share/php5.6-mysql /usr/share/man/man1/php.1.gz
$ which php
/usr/bin/php
1
задан 13 November 2017 в 14:16

2 ответа

несколько возможных проблем:

1) Возможно, у вас нет #!/bin/sh в качестве первой строки в update.sh

2) PHP может потребоваться выполнить дополнительные команды, но cron задания выполняются без установленной переменной PATH. Чтобы исправить это, используйте echo $PATH на терминале, где работает команда, а затем используйте export PATH=..., заменив ... на вывод echo $PATH выше

3) PHP может потребоваться другие переменные среды для функция. Отслеживайте их и экспортируйте их в update.sh до вызова /usr/bin/php.

Редактировать

ОК, это не 1)

Откройте новый (или новое ssh-соединение) и выполните:

for i in `env | sed 's/=.*//'` ; do unset $i ; done

Это приведет к отключению всех переменных среды, включая PATH. Затем попробуйте:

/usr/bin/php /var/www/html/site/update.php

Затем опубликуйте здесь сообщения об ошибках.

2
ответ дан 23 May 2018 в 04:58
  • 1
    Спасибо за ответ. Я обновил свой вопрос. Как вы видите, 1) and 2) в порядке. Я не уверен, что вы имеете в виду в 3)? – S.I. 21 October 2016 в 08:45
  • 2
    Просто вопрос, прежде чем я их отключил. Мне нужно будет снова установить их позже? И кстати, почему мне нужно протестировать это, поскольку скрипт работает, когда я запускаю его прямо так, как в терминале? – S.I. 21 October 2016 в 08:58
  • 3
    Вы отключите их только для текущего сеанса оболочки. Вот почему я попросил вас открыть новое окно. Как только вы закончите, просто введите exit, окно терминала закроется, и все вернется в нормальное состояние. – sмurf 21 October 2016 в 09:02
  • 4
    Готово. Я их отключил. Затем выполнил /usr/bin/php /var/www/html/site/update.php, и база данных обновилась. echo $PATH пуст. Нет ошибок и скрипт работает. – S.I. 21 October 2016 в 09:04
  • 5
    Хорошо, так что это не 2) и 3). Ваша проблема в другом месте, и я понятия не имею, где. Сожалею. – sмurf 21 October 2016 в 09:09

Проблема заключается в очень ограниченном пути поиска переменных crontab. Полный путь должен быть добавлен, чтобы добавить почти все ваши команды во все ваши скрипты и индексы. Или вы можете добавить один и тот же путь к сценарию, который у вас есть при запуске скрипта вручную.

Изменить с:

#!/bin/sh

list="/var/www/html/site"
config="/usr/bin/php"

for i in "$list"
do
    "$config" "$i"/update.php
done

Изменить с:

#!/bin/sh

PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

list="/var/www/html/site"
config="/usr/bin/php"

for i in "$list"
do
    "$config" "$i"/update.php
done

Примечание:

Добавленный поиск путей был взят из того, что вы опубликовали в своем вопросе, которые работают при запуске скрипта вручную. Если вы знаете, какой путь содержит команду из сценария вместе с любым скриптом или командой, вызванной скриптом update.php, то это единственные пути поиска, которые необходимо добавить.

2
ответ дан 23 May 2018 в 04:58
  • 1
    Благодарю. Нужно ли добавлять PATH в for сейчас? потому что все еще не обновляет базу данных – S.I. 21 October 2016 в 11:00
  • 2
    Нет. Просто добавьте одну строку в блок change to. – L. D. James 21 October 2016 в 11:02
  • 3
    Добавлено и cron все еще работает на 10мин и до сих пор не обновляется. Я добавил, что whereis php возвращается в терминал к моему вопросу, если он тоже помогает ... – S.I. 21 October 2016 в 11:04

Другие вопросы по тегам:

Похожие вопросы: