Cronjobs 不起作用,但命令行中相同的命令可以正常工作

Cronjobs 不起作用,但命令行中相同的命令可以正常工作

我已经安装了 Mautic(电子邮件程序)。它需要 3 个 cronjob 才能正常运行。

  • php /var/www/mydomainname/htdocs/app/console mautic:segments:update
  • php /var/www/mydomainname/htdocs/app/console mautic:campaigns:update
  • php /var/www/mydomainname/htdocs/app/console mautic:campaigns:trigger

我在 Ubuntu 18.04 上并且使用 PHP 7.0x。

当我执行sudo php /var/www/mydomainname/htdocs/app/console mautic:campaigns:trigger或上面列出的任何其他 3 项时,它们都可以正常工作。我得到了正确的输出并且它被执行了。

但是,当我在 crontab 中输入相同的命令时,什么也没有发生。

我什么都试过了。在根 crontab 中、在 www-data crontab 中、在我的用户 crontab 中,使用 PHP7.0 命令的绝对路径(在 中/usr/bin/php7.0)。甚至尝试过先更改php目录等等。

例如:

* * * * * /usr/bin/php7.0 /var/www/mydomainname/htdocs/app/console mautic:segments:update

或者:

* * * * * sudo /usr/bin/php7.0 /var/www/mydomainname/htdocs/app/console mautic:segments:update

或者:

* * * * * cd /usr/bin sudo php7.0 /var/www/mydomainname/htdocs/app/console mautic:segments:update

使用 crontab 时没有什么效果。

有人知道为什么吗?

答案1

詹斯·A·科赫回答CronJob 未运行(经过) 在堆栈溢出

以下是调试未运行的 cronjobs 的清单指南:

  1. Cron 守护进程是否正在运行?
    • 运行ps ax | grep cron并查找 cron。
    • Debian:service cron start或者service cron restart
  2. cron 正在工作吗?
    • * * * * * /bin/echo "cron works" >> /tmp/file
    • 语法正确吗?见下文。
    • 显然,您需要对要将输出重定向到的文件具有写权限。/tmp当前不存在的唯一文件名应始终可写。
  3. 该命令是独立工作吗?
    • 通过在 CLI 上进行试运行来检查脚本是否有错误
    • 测试命令时,请以您正在编辑其 crontab 的用户身份进行测试,该用户可能不是您的登录名或 root
  4. cron 可以运行你的工作吗?
    • 检查/var/log/cron.log/var/log/messages是否存在错误。
    • 乌本图:grep CRON /var/log/syslog
    • 红帽:/var/log/cron
  5. 检查权限
    • 在命令上设置可执行标志:chmod +x /var/www/app/cron/do-stuff.php
    • 如果将命令的输出重定向到文件,请验证您是否有权写入该文件/目录
  6. 检查路径
    • 查看 she-bangs / hashbangs 线路
    • 不要依赖 PATH 之类的环境变量,因为它们的值在 cron 下和在交互式会话下可能不一样
  7. 调试时不要抑制输出
    • 常用的是这种抑制:30 1 * * * command > /dev/null 2>&1
    • 通过完全删除来重新启用标准输出或标准错误消息输出>/dev/null 2>&1;或者重定向到您具有写访问权限的位置的文件:>>cron.out 2>&1将把标准输出和标准错误附加到cron.out调用用户的主目录中。

还是不起作用?哎呀!

  1. 提高 cron 调试级别
    • Debian
      • /etc/default/cron
      • EXTRA_OPTS="-L 2"
      • service cron restart
      • tail -f /var/log/syslog查看执行的脚本
    • Ubuntu
      • /etc/rsyslog.d/50-default.conf
      • 添加或注释掉行cron.crit /var/log/cron.log
      • 重新加载记录器sudo /etc/init.d/rsyslog reload
      • 重新运行 cron
      • 打开/var/log/cron.log并查找详细的错误输出
    • 提醒:调试完成后,请停用日志级别
  2. 运行 cron 并再次检查日志文件

Cronjob 语法

# Minute  Hour  Day of Month      Month         Day of Week    User Command    
# (0-59) (0-23)   (1-31)    (1-12 or Jan-Dec) (0-6 or Sun-Sat)  

    0       2       *             *                *          root /usr/bin/find

此语法是仅有的root用户来说是正确的。常规用户 crontab语法没有用户字段(普通用户不允许像其他用户一样运行代码);

# Minute  Hour  Day of Month      Month         Day of Week    Command    
# (0-59) (0-23)   (1-31)    (1-12 or Jan-Dec) (0-6 or Sun-Sat)  

    0       2       *             *                *          /usr/bin/find

Crontab 命令

  1. crontab -l
    • 列出所有用户的 cron 任务。
  2. crontab -e,针对特定用户:crontab -e -u agentsmith
    • 启动 crontab 文件的编辑会话。
    • 当退出编辑器时,修改后的crontab会自动安装。
  3. crontab -r
    • 从 cron 假脱机程序中删除 crontab 条目,但不从 crontab 文件中删除。

相关内容