通过crontab执行脚本时无法识别的参数

时间:2019-03-13 10:15:35

标签: bash cron

我的crontab设置如下(在docker容器中)。

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
5 * * * * bash /usr/local/bin/process-logs > /proc/1/fd/1 2>/proc/1/fd/

/usr/local/bin/process-logs旨在将使用mtools的一些MongoDB日志公开到简单的Web服务器。

脚本中有问题的部分非常简单。 raw_namearchive_name,没有文件扩展名。

    aws s3 cp "s3://${s3_bucket}/${file_name}" "${archive_name}" 
    gunzip "${archive_name}"

    mlogvis --no-browser "${raw_name}"

如果我按照上面的crontab配置中的指定手动运行命令

bash /usr/local/bin/process-logs > /proc/1/fd/1 2>/proc/1/fd/2

一切正常(这是mlogvis的预期输出)

...
copying /usr/local/lib/python3.5/dist-packages/mtools/data/index.html to /some/path/mongod.log-20190313-1552456862.html
...

通过crontab触发脚本时,它将引发以下错误

usage: mlogvis [-h] [--version] [--no-progressbar] [--no-browser] [--out OUT]
               [--line-max LINE_MAX]
mlogvis: error: unrecognized arguments: mongod.log-20190313-1552460462

导致以下错误(实际值而非参数)的mlogvis命令

mlogvis --no-browser "mongod.log-20190313-1552460462"

同样,如果我自己运行此命令,则一切正常。

mlogvis:http://blog.rueckstiess.com/mtools/mlogvis.html

我不认为这是文件权限不正确或不存在的问题,因为mlogvis在这些情况下会产生不同的错误。我还测试了从文件名中删除'-'的想法,认为它可能试图将它们解析为参数,但是没有区别。

我知道cron执行与我测试脚本的用户所具有的执行环境不同。我已将PATH设置为与用户相同,并且在容器启动时,我执行env >> /etc/environment,因此所有环境变量都已正确设置。

有人知道一种调试方法吗,还是有人遇到类似的问题?脚本的所有其他组件都在起作用,除了mlogvis才是此工作的核心。

我已尝试修复的摘要:

  • 将执行cron的环境和PATH设置为与我测试脚本的用户相同
  • -替换为文件名,以查看其是否将零件解析为参数
  • 对具有完整权限的文件名进行硬编码,以查看它是否与权限相关
  • 手动运行脚本->可行
  • 手动独立运行mlogvis命令->可行

2 个答案:

答案 0 :(得分:0)

在执行脚本之前尝试加载/home/user/.bash_profile,然后重试。我怀疑您缺少PATH或其他未设置的环境变量。

source /home/user/.bash_profile

答案 1 :(得分:0)

请发布完整的脚本,因为通过crontab执行时, 您必须确保正确创建了raw_name变量。如 它似乎取决于archive_name,可以发布更多上下文 帮助我们为您提供帮助。

无论如何,如果您正在使用bash,则可以尝试类似以下操作:

aws s3 cp "s3://${s3_bucket}/${file_name}" "${archive_name}" 
gunzip "${archive_name}"

# here you have to be sure that archive_name is correct
raw_name_2=${archive_name%%.*}

mlogvis --no-browser "${raw_name_2}"

这不会解决您的问题,但可能会使您更接近正确的道路。