【问题标题】:env issues when running cron bash script运行 cron bash 脚本时的环境问题
【发布时间】:2013-02-05 18:14:46
【问题描述】:

我有一份由 cron 执行的夜间报告,其中包含以下几行:

PRINTFX="/usr/bin/printf"
<snip>
${PRINTFX} "%-11s %-11s %'d\n" ${F1} ${F2} ${F3}

crontab 条目:

[ca-adm@homwpspect01 ~]$ crontab -l
55      01      *       *       *       /usr/local/sbin/CRONSQLEvents

我的问题是,如果我以 root 身份手动运行它(即使用我的登录环境设置),我会得到这个 [CORRECT] 输出:

Date        Event       Count
2013-02-19  0x00010802  516,616
2013-02-19  0x00010D66  351,840
2013-02-19  0x00010D67  351,533

当 cron 作为另一个用户运行时,我得到 [InCorrect]:

Date        Event       Count
2013-02-19  0x00010802  516616
2013-02-19  0x00010D66  351840
2013-02-19  0x00010D67  351533

如果它由 cron 运行,则数字输出中缺少逗号。我记得读过一些关于 printf 的使用模棱两可的东西,因为有一个 bash 内部函数,但 /usr/bin 中也有一个外部函数:

[root@homwpspect01 sbin]# which printf
printf is a shell builtin
printf is /usr/bin/printf

有人可以告诉我如何避免 cron 与登录执行的这个问题吗? 特别是考虑到我无论如何都在脚本中指定了 /usr/bin/printf ?

提前致谢, 唐

【问题讨论】:

    标签: bash cron


    【解决方案1】:

    使用%'d 打印的数字格式取决于当前的语言环境,而不是(必然)您使用的printf 命令。

    如果您的脚本与您向我们展示的一样,那么您正在调用/usr/bin/printf

    在我的系统上:

    $ echo $LANG
    en_US.UTF-8
    $ printf "%'d\n" 123456
    123,456
    $ /usr/bin/printf "%'d\n" 123456
    123,456
    $ LANG=C printf "%'d\n" 123456
    123456
    $ LANG=C /usr/bin/printf "%'d\n" 123456
    123456
    $
    

    Bash 的内置 printf/usr/bin/printf(来自 GNU Coreutils)表现一致。

    您可能需要在脚本中设置$LANG 以获得您想要的行为。

    %'d 格式记录在GNU libc manual

    '

    根据指定的语言环境将数字分成组 对于LC_NUMERIC 类别; *注意通用数字::。这面旗帜是 GNU 扩展。

    【讨论】:

    • 谢谢 - 这绝对是问题所在 - 我现在可以正常工作了......
    【解决方案2】:

    所以为了让它正常工作,我将在脚本中添加这一行:

    export LANG=en_US.UTF-8
    PRINTFX="/usr/bin/printf"
    <snip>
    ${PRINTFX} "%-11s %-11s %'d\n" ${F1} ${F2} ${F3}
    

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 2012-10-22
      • 2013-11-26
      • 2011-08-10
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      相关资源
      最近更新 更多