我的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_name
是archive_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
才是此工作的核心。
我已尝试修复的摘要:
-
替换为文件名,以查看其是否将零件解析为参数答案 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}"
这不会解决您的问题,但可能会使您更接近正确的道路。