代码之家  ›  专栏  ›  技术社区  ›  PPP

当通过crontab运行脚本时,问题来了。在shell上手动运行时,没有问题[重复]

  •  -1
  • PPP  · 技术社区  · 2 年前

    我有一个perlscript文件在crontab中运行良好,但它突然停止运行,没有任何修改。

    cd /home/user/public_html/crons && ./script.pl 2>&1 >/dev/null
    
    • 脚本文件的顶部是 #!/usr/bin/perl -X
    • 此脚本预期的输出是数据库中的更改
    • 我有另一个经过相同修改的脚本文件,仍然可以正常工作
    • 当我在浏览器中运行文件时,它运行良好,执行所有行都没有任何问题
    1. 我试过全程 /usr/bin/perl 但没用
    2. 我试过了 Perl 一开始,但没有起作用
    3. 我使用putty从SSH运行命令,但什么也没发生
    4. 我检查了日志文件 /var/log/cron 但没有任何错误
    5. 我创建了临时日志文件 cd /home/user/public_html/crons/script.pl> /tmp/temp.log 2>&1 查看错误,但日志为空

    以下是解决方案:-

    我发现了这个问题,同一个cron文件有一个卡住的进程,所以我杀死了这个进程并修复了它

    你可以找到这样的文件进程 ps aux|grep'您的cron文件在这里'

    0 回复  |  直到 6 年前
        1
  •  3
  •   dataless    6 年前

    这是人们似乎倾向于使用cron的一种非常常见的反模式。

    Cron会向您发送一封带有脚本输出的电子邮件, 如果 它产生任何输出。人们经常将输出重定向到 /dev/null 以阻止cron发送电子邮件。这很糟糕,因为现在脚本的输出完全丢失了。即使脚本有一些内置的日志记录,它也可能在打开日志文件之前生成错误,这些错误会丢失。它也可能以一种不会写入日志记录机制的方式崩溃。

    至少,您应该删除 2>&1 >/dev/null 开始接收电子邮件。(此外,使用临时cron作业测试邮件设置,如 1 * * * * echo "Test" )

    下一个更好的解决方案是将其更改为 >> /var/log/myscript/current.log 然后还设置一些东西来旋转日志文件(比如 logrotate )并确保使用允许脚本用户写入的权限创建该目录。通过仅重定向脚本的STDOUT,它写入STDERR的任何错误或警告都会导致您收到电子邮件,如果没有错误/警告,则输出将转到日志文件,也不会发送电子邮件。

    不过,这两项更改都没有解决根本问题,即当cron运行脚本时,它使用的环境与命令行上的环境不同。您真正想要的是一种在一致的环境中运行脚本的方式, 记录它。“最终解决方案”是在某种服务管理器中定义您的任务,然后偶尔使用cron来启动它。例如,您可以使用systemd定义一个不重新启动的服务,然后使用 systemctl start my_custom.service 在你的cron工作中。现在,您可以独立于cron进行测试,并且您的测试将具有完全相同的环境,并由服务管理器记录。作为额外的奖励,您可以避免意外地同时运行两次脚本,并且可以获得一种干净的方法来停止正在运行的cron作业,而不会有过时pid文件的危险。

    我自己并不特别提倡systemd,但谢天谢地,有很多替代方案:

    (但是,如果您的发行版是基于systemd的,那么安装和配置服务管理器要比仅使用systemd更艰巨。)每一项都允许您定义一个不会重新启动的服务。然后,使用shell命令向主管发出“运行一次”指令,该主管将任务作为子任务运行。现在,您可以轻松地自己启动作业,并查看日志中的所有错误,然后将该命令添加到crontab中,并知道当cron启动它时,它将以相同的方式运行。

    回到您最初的问题,一旦您获得一些日志记录,您可能会发现这是权限问题或系统perl中的升级模块。

    推荐文章