Я знаю, что существует большой подобный вопрос, и я попробовал много вещей, но все еще не могу заставить его работать.
У меня есть 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
Вы, кажется, путаете два различных метода вызова 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.
несколько возможных проблем:
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
Затем сообщение здесь сообщения об ошибках.
Проблемой является очень ограниченный поиск переменной пути 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
сценарий, то это - единственные пути поиска, который должен быть добавлен.