【问题标题】:Linux system command not working in Perl script via crontabLinux 系统命令无法通过 crontab 在 Perl 脚本中运行
【发布时间】:2013-09-17 09:54:30
【问题描述】:

我每 30 分钟在 crontab 中添加一个脚本。该行如下:

  */30 * * * * root perl /root/perl.pl

上述脚本执行了系统命令“top”,并打印在日志文件中。

如果我手动运行它运行良好。但是在通过 crontab 运行它时,它并没有显示出想要的结果。请有人帮我解决这个问题。谢谢你。


上述perl脚本中的命令是:

 $top = `sudo top`;

我得到的错误是:

sudo: sorry, you must have a tty to run sudo

我将命令从 sudo 更改为 visudo。但问题依然存在。

【问题讨论】:

  • roor命令是什么,为什么在perl前面?
  • root 是以超级用户身份运行脚本。这有影响吗?
  • 当脚本在命令行上运行但从 crontab 运行时失败时,它几乎总是环境。要么你的 crontab 中没有设置一个环境变量,要么你希望它在不同的目录中启动。
  • @cjm - 请您详细说明或至少给我一些提示如何解决它。谢谢。
  • 转储 %ENV 看看有什么不同。

标签: linux perl crontab


【解决方案1】:

您应该在 cron 中使用完整路径(并使用which perl 查找完整路径):

*/30 * * * * root /usr/bin/perl /root/perl.pl 

或者更好的是,使用chmod +x 使脚本可执行,并将解释器添加到脚本的开头#!/usr/bin/perl -w 并直接从cron 调用它

*/30 * * * * root /root/perl.pl 

另外,如果 perl 脚本有问题,你可以像这样从 cron 输出结果

*/30 * * * * root /root/perl.pl > /tmp/myscript.log

【讨论】:

    【解决方案2】:

    您应该查看有关 visudo 的 requiretty 设置。查找显示为Defaults requiretty 的行。您可以尝试将其注释掉,但您会牺牲一些安全性。见man sudoers

    您也可以尝试在批处理模式下运行top,一次迭代:

    $top = `sudo top -bn1`;
    

    批处理模式选项用于将输出发送到其他程序。

    【讨论】:

      猜你喜欢
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 2015-05-12
      • 2021-05-27
      • 2015-06-28
      • 1970-01-01
      相关资源
      最近更新 更多