Крон выполняется, но сценарий не работает

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

У меня есть 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 не обновляет базу данных. Мой крон

*/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

Какая-либо идея, какова может быть проблема?

Обновление: ПУТЬ

$ 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 теперь о кроне.

$ 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
4
задан 13 November 2017 в 13:16

3 ответа

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

Ubuntu наследовала от Debian несколько запутывающую политику поддержки обоих пользователей crontabs это хранится в области шпульки /var/spool/cron, и задания крона в масштабе всей системы, выполненные от /etc/crontab и файлы в /etc/cron.d.

Задания, указанные в /etc/crontab или через файлы в /etc/cron.d нужно дополнительное поле, чтобы позволить им быть выполненными как другой пользователь, таким образом, формат - что-то как

*/10 * * * * <username> <command> <args>

Задания настраиваются через использование области шпульки crontab -e (или sudo crontab -e для корня), уже принадлежат определенному пользователю и не нуждаются в пользовательском поле

*/10 * * * * <command> <args>

Если Вы включаете поле имени пользователя в задание крона, настроенное через a crontab -e команда, это будет неправильно истолковано как команда: поскольку мы видим от Вашего вывода журнала,

Oct 21 07:30:01 stan CRON[7604]: (stan) CMD (stan /home/stan/update.sh)

cron интерпретирует stan как команда с аргументом /home/stan/update.sh

Решение должно быть просто для удаления имени пользователя stan от Вашего crontab.

4
ответ дан 1 December 2019 в 09:07

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

1) Вы не можете иметь #!/bin/sh как первая строка в update.sh

2), PHP, возможно, должен выполнить дополнительные команды, но задания крона выполняются без устанавливаемой переменной ПУТИ. Для фиксации того использования 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

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

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

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

2
ответ дан 1 December 2019 в 09:07

Проблемой является очень ограниченный поиск переменной пути 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
ответ дан 1 December 2019 в 09:07

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

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