【问题标题】:Perl script file run manually but not in crontabPerl 脚本文件手动运行,但不在 crontab 中
【发布时间】:2020-07-29 02:51:25
【问题描述】:

我有一个 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辅助| grep '你的 cron 文件在这里'

【问题讨论】:

  • 您应该在 crontab 文件中使用MAILTO = user@mail.server.dn 来通知问题的根源。请访问webpage进行解释。
  • 以下webpage 给出了其他更详细的示例。
  • 我刚做了,但没有收到邮件
  • 检查您计算机上的邮件设置 -- 很有可能某些内容配置不正确。
  • 请务必删除所有重定向,以确保在从 cron 引发错误时获得电子邮件输出。

标签: perl cron


【解决方案1】:

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

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

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

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

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

我自己并不特别提倡 systemd,但幸运的是有很多替代方案:

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

回到你原来的问题,一旦你得到一些日志,你可能会发现这是一个权限问题或系统 perl 中的升级模块。

【讨论】:

  • 感谢您的解释。首先,我使用临时 cron 作业对邮件设置进行了测试,我立即收到了邮件1 * * * * echo "Test",这意味着邮件设置工作正常,但我没有收到任何属于script.pl 的邮件或错误。然后我做了日志文件技巧>> /var/log/myscript/current.log,日志又是空的。同时,当我在浏览器中运行文件时,它工作正常并且执行所有行没有任何问题。那么,什么可能导致这个问题
  • 实际上,您是在描述一个 CGI 脚本,对吧?当 Web 服务器运行 CGI 脚本时,它还会设置一些环境变量,如 REQUEST_URI、HTTP_SERVER 等。可能你的脚本只有在正常的 CGI 环境下才能正确运行。很多人为此做的是有一个 cron 作业来获取 URL,而不是直接运行脚本。喜欢wget -O- -nv http://localhost/path/to/script.pl >> /var/log/myscript/current.log
  • 我发现了问题,同一个 cron 文件有一个卡住的进程,所以我杀死了这个进程并修复了它
猜你喜欢
  • 2021-05-01
  • 2015-05-12
  • 2016-11-19
  • 2013-01-14
  • 1970-01-01
  • 2013-10-18
  • 2014-01-02
  • 1970-01-01
相关资源
最近更新 更多