运行相同的 bash 脚本会产生从 shell 或作为 cron 作业运行的不同输出。
描述
- 创建具有内容的最简单文本文件
touch /tmp/forbashtest ; printf "Lorem ipsum we have Release 1.1.5 version and also should be \$dbstore variable in text so let's check\n" > /tmp/forbashtest
- 创建简单的 bash(即 text_ask.sh)来检查此文件中是否存在文本
#!/bin/bash
version=$(/usr/bin/ack "Release 1.1.5" /tmp/forbashtest | wc -l) ; printf "version count = $version\n" ;
dbexist=$(/usr/bin/ack "dbstore" /tmp/forbashtest | wc -l) ; printf "dbexist count = $dbexist\n" ;
if [[ "$version" -eq "0" ]] && [[ "$dbexist" -eq "0" ]] ; then
echo "Version CHANGED and DB insert not exists";
else
echo "Version still 1.1.5 and DB INSERT at place";
fi
exit ;
sh
首先从 shell 运行
sh /a/test_ask.sh > /tmp/test_ask_shell.txt ;
输出 /tmp/test_ask_shell.txt - 应为 TRUE 答案
version count = 1
dbexist count = 1
Version still 1.1.5 and DB INSERT at place
第二次以 cronjob 身份运行,将以下行添加到 /var/spool/cron/root
15 6 * * * sh /a/test_ask.sh > /tmp/test_ask_cron.txt ;
输出 /tmp/test_ask_cron.txt - 错误答案!
version count = 0
dbexist count = 0
Version CHANGED and DB insert not exists
问题是 - 这怎么可能发生?我看不出有什么逻辑。
chown 0755 /a/test_ask.sh 没有帮助,设置绝对路径 /usr/bin/ack 而不是仅仅“ack” - 相同。
“好像”使用 /var/spool/cron/root 的 crond 服务没有足够的 root 权限来执行 BASH 脚本中的命令或类似的东西。
Alma9 基于 CentOS - 但我从未遇到过 CentOS 这样的问题 - 在 CROND 服务(或 LOGROTATE 服务)下运行的任何脚本都执行与直接从 root shell 运行相同的操作。
非常感谢你的想法,理解并尝试解决,
我安装并运行了脚本中的
ack
设置 + 原始调用。原始调用在运行时不会生成任何输出(因此会进行计数) 。ack
ack
0
cron
在 上运行网络搜索后,
ack AND cron
我找到了这个github 问题链接。OP 遇到了同样的问题,即ack
无法使用cron
。在该链接的底部,用户 hoelzro 提供了以下解释:
因此,当运行时
cron
ack
感觉不到 tty,因此切换到寻找来自管道或文件重定向的输入,并且由于不存在这样的输入(在这种情况下)输入实际上是“空的”并且没有生成输出,这反过来意味着wc -l
返回0
。解决方案/解决方法:添加
--nofilter
到ack
调用中,例如:从
ack --help
:--nofilter
添加所有调用后,ack
我的crontab
工作现在会产生预期的结果:注意:我只是传递我在简短搜索中发现的内容;我与设计或开发无关
ack
,因此无法解释为什么它会出现这种情况