运行相同的 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
#!/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 - 正确的答案应该是
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” - 相同。
“AS IF”使用 /var/spool/cron/root 的 crond 服务没有足够的 root 权限来执行 BASH 脚本或类似内容中的命令。
Alma9 是基于 CentOS 的 - 但我在 CentOS 上从未遇到过这样的问题 - 在 CROND 服务(或 LOGROTATE 服务)下运行的任何脚本都执行与直接从 root shell 运行相同的操作。
非常感谢理解并尝试解决这些想法,
我安装了
ack
并在脚本中运行了您的设置 + 原始 ack
调用。 原始 ack
调用不会生成输出(因此 0
计数)。
在
ack AND cron
上运行网络搜索,我找到了这个链接。 OP也有同样的问题,即ack
在cron
中不“工作”。 解决方案/解决方法:将 --nofilter
添加到 ack
调用中(例如,/usr/bin/ack "dbstore" /tmp/forbashtest
J)。
在该链接的底部,用户 hoelzro 提供了以下解释:如果
ack
感知到没有 tty(从 cron
运行时就是这种情况),那么 ack
假设输入来自管道(在您的案例是空的,因此 ack
调用没有输出)。
来自
ack --help
:
--[no]filter Force ack to treat standard input as a pipe
(--filter) or tty (--nofilter)