AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 839941
Accepted
S.I.
S.I.
Asked: 2016-10-21 21:29:47 +0800 CST2016-10-21 21:29:47 +0800 CST 2016-10-21 21:29:47 +0800 CST

Cron 已执行,但脚本不起作用

  • 772

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

我有计划在 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)

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

./update.sh

但是来自 cronjob 不会更新数据库。我的 cron

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

从 shell 脚本产生的命令是

/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

参考我昨天关于 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

$ which php
/usr/bin/php
scripts
  • 3 3 个回答
  • 4048 Views

3 个回答

  • Voted
  1. Best Answer
    steeldriver
    2016-10-22T05:00:01+08:002016-10-22T05:00:01+08:00

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

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

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

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

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

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

    如果您在通过命令设置的 cron 作业中包含用户名字段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
  2. sмurf
    2016-10-21T21:40:15+08:002016-10-21T21:40:15+08:00

    几个可能的问题:

    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
  3. L. D. James
    2016-10-21T23:35:52+08:002016-10-21T23:35:52+08:00

    问题是 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

相关问题

  • 如何在 Nautilus 中管理保存的完整网页及其目录(例如 n.html 和 n_files)

  • 如何每 5 秒运行一次脚本?

  • 如何将必须从其自己的目录中运行的程序添加到面板或主菜单?

  • 如何编写 shell 脚本来安装应用程序列表?

  • Mac OS X Automator 的替代品?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve