【问题标题】:Perl script shows different behavior inside cron jobPerl 脚本在 cron 作业中显示不同的行为
【发布时间】:2012-11-05 09:51:15
【问题描述】:

我在 perl 脚本中执行以下命令。

#!/usr/bin/perl

my $MPSTAT="/usr/bin/mpstat";
my $GREP="/bin/grep";
my $FREE = "/usr/bin/free";
my $AWK = "/bin/awk";
my $cpu = `$MPSTAT | $GREP all | $AWK '{print (100 - \$12)}'`;
print "CPU is $cpu";

当我手动运行这个 perl 脚本时,它会正确执行并提供正确的 CPU 使用率(以 %(100 - 空闲 CPU)为单位)

但是当我将它作为一个 cronjob 执行时,它总是打印 100 并且 awk 的 12 美元似乎得到了 0 的值。任何关于它在 cron 中为什么表现不同的指针都会有所帮助。

【问题讨论】:

  • 去掉awk 语句,只打印grep 的整个输出。然后你就可以看到awk 的输入是否与你期望的不同。
  • 如果您从此代码中删除my $,则它的有效外壳代码。用这种方式写 perl 是一件坏事。
  • @jordanm 是的,我同意。但是这里我只是复制了 900 行 perl 脚本的一小部分。

标签: perl scripting cron


【解决方案1】:

作为 cron 的子节点运行的主要区别是:

  1. 用户 ID 可能不同(root 用户与普通用户)
  2. 环境几乎是空的,至少完全不同

第二部分通常意味着程序可能会以不同的语言或数字格式输出,因为LANGLC_* 环境变量的值可能是为普通用户设置的,但在 cron(或反之亦然)。

【讨论】:

  • 但在我的脚本中,我不依赖任何环境变量/用户依赖。
  • 您的脚本本身不依赖于它们,但您正在执行外部程序。例如,对于德语语言环境,“free”输出“Größe”等,对于英语语言环境输出“Size”。时间、日期和数字格式相同。
  • 现在明白了。感谢您的澄清。
【解决方案2】:

使用@WinnieNicklaus 提供的提示找到解决方案

mpstat 在 cron 中给出不同的结果。

正常执行:

04:53:18 PM  all   49.51    0.00    4.79    2.67    0.02    0.34    0.00    0.00   42.68

Cron 内部:

16:54:01   all   49.51    0.00    4.79    2.67    0.02    0.34    0.00    0.00   42.68

由于 PM 没有在 cron 中打印,因此当将 awk 的参数更改为 $11 而不是 $12 时,它开始工作。

【讨论】:

  • 正如 Moritz 所指出的,这种差异几乎可以肯定是由于 $LANG$LC_* 环境变量的不同值。
猜你喜欢
  • 2012-03-02
  • 1970-01-01
  • 2011-05-10
  • 2014-08-03
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
  • 2014-04-16
相关资源
最近更新 更多