【问题标题】:Trouble running a bash script with crontab使用 crontab 运行 bash 脚本时遇到问题
【发布时间】:2012-10-03 06:39:42
【问题描述】:

我有一个 bash 脚本,用于检查我的 PHP 服务是否正在运行,并在需要时启动它。

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

KP=$(pgrep -P 1 -f script.php)
if [ "X$KP" = "X" ]
    then
        /usr/bin/nohup php /var/www/test/script.php >>/var/www/test/log.txt 2>&1 &
fi

然后我将以下条目添加到crontab -e(作为我的用户)。

* * * * * /var/www/test/startup >> /var/www/test/cron.log 2>&1 &

cron 运行,查看htop 可以看到进程。但是,它似乎没有工作或写入日志。它只是坐在那里使用 0% 的 CPU。 /var/www/test/ 文件夹归我所有,日志文件拥有 666 权限。

怎么了?或者更确切地说,我可以更改什么以使错误日志正常工作,以便我知道出了什么问题?

【问题讨论】:

  • 如果您从命令行手动运行代码,它可以工作吗? ` /usr/bin/nohup php /var/www/test/script.php >>/var/www/test/log.txt 2>&1 & `
  • @Crazy_Bash,输出为[1] 1858(pid)并且进程正在运行。它似乎也写入了log.txt 文件。
  • 多半是权限问题,试试在crontab里加sudo
  • 但是如果它从 CLI 以普通用户身份运行,为什么需要从 cron 以 root 身份运行?

标签: php linux bash cron


【解决方案1】:

我建议添加调试内容。一些可能的失败是:

您的用户可以实际运行/var/www/test/startup 脚本吗?你的用户可以写信给/var/www/test/cron.log吗?我建议只使用 crontab 条目:

* * * * * /var/www/test/startup

任何输出(stdin 和 stderr)都应该通过电子邮件发送给您的用户(除非 sendmail 在这台机器上损坏)。

pgrep 在哪里?是否在PATH=...设置的路径中。同上php

$KP 是什么?将其回显到您知道可写的日志文件:

touch /tmp/mylog
chmod 666 /tmp/mylog

然后在脚本中:

echo "I'm getting pgrep from <`type -p pgrep`>" >>/tmp/mylog
echo "KP is now <$KP>" >>/tmp/mylog

也许script.php 进程已经在运行并且属于PID 1?

也许脚本没有/var/www/test/log.txt 的写权限? /var/www/test 归您所有或 /var/www/test/log.txt 是否为 666 都无关紧要,如果您的父目录之一不可写或不可执行。仔细检查:

if [ ! -w /var/www/test/log.txt ]; then echo "Cannot write to /var/www/test/log.txt"; fi

【讨论】:

    【解决方案2】:

    我怀疑它与 nohup 有关。如果标准输入是终端,它只会做特殊的事情。但我不确定为什么这会有所作为,因为没有必要在 cron 作业中分离后台进程。

    但也许这会有所帮助:

    (/usr/bin/nohup php /var/www/test/script.php >>/var/www/test/log.txt 2>&1 &)
    

    【讨论】:

      猜你喜欢
      • 2016-01-05
      • 2018-11-17
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 2017-12-02
      • 2018-08-10
      • 1970-01-01
      相关资源
      最近更新 更多