我的无线设置每天都会失败好几次,重新启动 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 在非常小的环境中运行命令。我建议您按顺序尝试:
- 对脚本中进行的任何调用使用完整路径。
在 crontab 条目中,使用 perl 明确执行脚本。
/usr/bin/perl /home/joe/netcheck.pl
捕获两者标准输出和标准错误脚本的输出。
/usr/bin/perl /home/joe/netcheck.pl 1>/home/joe/netcheck-stdout.log 2>/home/joe/netcheck-stderr.log &
暂时
exec "nm-applet"
用exec "ls"
或其他简单命令替换来检查问题是否出在 nm-applet 所期望的环境中,而不是脚本本身。- 检查执行是否
nm-applet –sm-disable
有帮助。 - 如果仍然卡住,请
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,但更奇怪的事情发生了。