【问题标题】:Bash script returns different value when run from cron job than from command line从 cron 作业运行时,Bash 脚本返回的值与从命令行运行时不同
【发布时间】:2012-04-10 00:14:41
【问题描述】:

我有一个打算从 cron 运行的 bash 脚本。该脚本计算文档中的字数,并将当前时间和字数添加到 CSV 文件中。在相关部分,脚本是:

EPOCH=$(date +"%s")
WCC=$(wc -w ~/path/filename.txt | sed 's/\/Users\/username\/path\/filename.txt//' | sed 's/ //g')
echo $EPOCH,$WCCH4 >> ~/path/wordcount-data.csv

此脚本从 cron 运行,具有以下条目:

0   *   *   *   *   sh /Users/username/path/wordcount.sh

问题是wc -w 从 cron 运行时返回的值与从 shell 运行或从终端中执行的 shell 脚本运行时返回的值不同。换句话说,从 cron 执行的这个脚本的值当前是 12438,但是在 shell 中运行 wc -w filename.txt 或运行 sh ./wordcount.sh 都返回值 12445。值得一提的是,差异始终是 7,并且 vim 的字数匹配字数统计来自 cron。

是什么导致了不同的值,我该如何解决?

【问题讨论】:

  • 看起来是语言环境问题。您的 filename.txt 是否包含任何非 ASCII 字符? LANG=C wc -w filename.txt 产生了什么?
  • 尝试运行一个简单地记录 cron 为您设置的环境的 cron 作业:/usr/bin/env > /tmp/env.cron。可能会有一组非常小的值集。当问题是“它可以从命令行工作,但不能从 cron 工作”时,答案是(99% 的时间)environment。

标签: bash shell cron crontab


【解决方案1】:

我为此浪费了很多时间,只是在 shell 脚本文件的开头丢失了它:#!/bin/bash

【讨论】:

    【解决方案2】:

    尝试添加

    source ~/.bashrc

    在shebang之后,还有一件重要的事情:

    如果是 bash,请不要使用 sh 调用脚本!

    使用sh,bash 处于POSIX 模式。我怀疑这里不是故意的。

    【讨论】:

    • 我已将source /Users/lmullen/.bash_profile 添加到脚本中。现在,无论是从 cron 调用还是由 ./wordcount.sh 调用,脚本都会返回相同的值。我怀疑wc 的不同版本对什么是一个词有不同的定义,这也可以解释wc -w 和vim 的字数之间的差异。谢谢。
    【解决方案3】:

    同意 beny23 的观点,这是 cron 脚本中最常见的错误,因为 cron 没有继承您的 PATH。你必须在 crontab 中设置一个 cronpath,或者使用绝对路径。

    第二个错误来源可能是,它是由不同的用户运行的。

    第三个,你调用sh scriptname,而不是直接调用scriptname,这意味着shebang被忽略了。你为什么这样做?脚本不是标记为可执行的吗?

    【讨论】:

      【解决方案4】:

      当您运行sh ./wordcount.sh 时,哪个用户正在运行该脚本?

      我怀疑执行 cron 的用户不一样,所以它的 home (~) 目录不一样。

      我会将脚本中对 ~ 的任何引用更改为绝对目录路径。

      【讨论】:

      • crontab 文件特定于创建它的用户。进程以创建它的用户身份运行。
      • 感谢您的建议。我已将所有路径更改为绝对路径。我还使脚本可执行,现在在没有sh 命令的情况下调用它。正如 Jonathan Leffler 建议的那样,cron 应该以我的用户身份运行脚本。尽管如此,运行脚本 ./wordcount.sh 并从 cron 运行它会为 wc 返回不同的值。有什么想法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 2014-08-03
      • 2019-09-28
      • 1970-01-01
      相关资源
      最近更新 更多