Perlscript 在手动执行时运行良好,但在 cron 下执行则不行

Perlscript 在手动执行时运行良好,但在 cron 下执行则不行

我的无线设置每天都会失败好几次,重新启动 gnome 的网络管理器会有所帮助。我想自动执行此操作,并破解了以下 perlscript:

#!/usr/bin/perl                                                                                                                                                   

use strict;
use warnings;

my $result = system "ping -c1 -W1 192.168.1.1";

if ($result != 0) {
  print "No connectivity. Action required...\n";
  my $pid = `pgrep nm-applet`;
  if ($pid) {
    print "Killing current nm-applet instance $pid\n";
    system "kill $pid";
  }

  print "Starting nm-applet...";
  exec "nm-applet" or die "couldn't start nm-applet";

} else {
  print "Looks all fine. No action required\n";
}

我的第一个测试是手动关闭 nm-applet,然后手动运行脚本。它检测不到任何连接,并“变身”为 nm-applet,正如预期的那样。

现在进行相同的测试,但由以下 cron 作业执行:

*/1 * * * * /home/joe/netcheck.pl >> /home/joe/netcheck.log &

netcheck.log 中的输出只是“正在启动 nm-applet...”,但它并没有启动。进程立即终止。

任何帮助或其他解决方案均值得赞赏。

答案1

正如所有回答者已经指出的那样,cron 在非常小的环境中运行命令。我建议您按顺序尝试:

  1. 对脚本中进行的任何调用使用完整路径。
  2. 在 crontab 条目中,使用 perl 明确执行脚本。

    /usr/bin/perl /home/joe/netcheck.pl

  3. 捕获两者标准输出标准错误脚本的输出。

    /usr/bin/perl /home/joe/netcheck.pl 1>/home/joe/netcheck-stdout.log 2>/home/joe/netcheck-stderr.log &

  4. 暂时exec "nm-applet"exec "ls"或其他简单命令替换来检查问题是否出在 nm-applet 所期望的环境中,而不是脚本本身。

  5. 检查执行是否nm-applet –sm-disable有帮助。
  6. 如果仍然卡住,请strace nm-applet改为执行以跟踪系统调用。正常运行并在 cron 内识别日志偏离的调用。从该点开始调试。

话虽如此,我并不惊讶 nm-applet 无法在 cron 中正常运行。它可能需要访问 cron 环境中缺少的 display 和 gnome 库。at 作业可能更好,但即使这样也不理想。我建议使用威克德相反,如果您需要从 cron 作业重新连接。

答案2

Cron 在非常小的环境下运行。为所有 shell 命令提供明确的完整路径(例如,使用等/sbin/ping代替ping- 使用 等首先检查相关项目的位置whereis ping),它应该可以正常运行。

答案3

一般来说,您无法从 cron 启动 GUI 应用程序,因为 cron 没有环境、桌面、显示等。

在 cron 中尝试这个

*/1 * * * * export DISPLAY=:0 && /home/joe/netcheck.pl >> /home/joe/netcheck.log &

或者不要在 crontab 中设置 DISPLAY,而是尝试在脚本本身中设置。我不确定哪种方法可行。

答案4

在您的脚本中,尝试在“exec nm-applet”调用之前转储系统 PATH。nm-applet 存在于我的系统的 /usr/bin 中,我无法想象默认 PATH 不包含 /usr/bin,但更奇怪的事情发生了。

相关内容