Cron 已执行但脚本不起作用

S.I*_*.I. 5 php scripts cron

我知道有很多类似的问题,我已经尝试了很多东西,但仍然无法使其发挥作用。

我有计划运行 10 分钟的 cronjob。我可以看到/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)
Run Code Online (Sandbox Code Playgroud)

update.sh调用php更新数据库的脚本。当我直接从终端运行时,shell 脚本数据库已更新并且工作正常

./update.sh
Run Code Online (Sandbox Code Playgroud)

但 cronjob 不会更新数据库。我的克罗恩

*/10 * * * * stan /home/stan/update.sh
Run Code Online (Sandbox Code Playgroud)

shell 脚本生成的命令是

/usr/bin/php /var/www/html/site/update.php
Run Code Online (Sandbox Code Playgroud)

两个文件的权限

-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
Run Code Online (Sandbox Code Playgroud)

知道可能是什么问题吗?

更新:路径

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Run Code Online (Sandbox Code Playgroud)

update.sh

$ cat update.sh 
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)

参考我昨天的问题,该问题是关于 shell 和 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
Run Code Online (Sandbox Code Playgroud)
$ which php
/usr/bin/php
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 4

您似乎混淆了两种不同的调用cron作业的方法。

Ubuntu 从 Debian 继承了一个有点令人困惑的策略,即支持crontabs存储在假脱机区域中的用户/var/spool/cron和运行的系统范围的 cron 作业/etc/crontab以及/etc/cron.d.

/etc/crontab在文件中或通过文件指定的作业/etc/cron.d需要额外的字段,以便允许它们作为不同的用户运行,因此格式类似于

*/10 * * * * <username> <command> <args>
Run Code Online (Sandbox Code Playgroud)

crontab -e使用(或root)通过假脱机区域设置的作业sudo crontab -e已经属于特定用户,并且不需要用户字段

*/10 * * * * <command> <args>
Run Code Online (Sandbox Code Playgroud)

如果您在通过命令设置的 cron 作业中包含用户名字段crontab -e,它将被误解为命令:正如我们从日志输出中看到的那样,

Oct 21 07:30:01 stan CRON[7604]: (stan) CMD (stan /home/stan/update.sh)
Run Code Online (Sandbox Code Playgroud)

cron被解释stan为带参数的命令 /home/stan/update.sh

解决方案应该只是stan从 crontab 中删除用户名。