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