Almalinux 9 相同的 bash 脚本与 shell 和 cron 的工作方式不同

问题描述 投票:0回答:1

运行相同的 bash 脚本会给出从 shell 运行或作为 cron 作业运行的不同输出。

描述

  1. 创建最简单的包含内容的文本文件

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 

  1. 创建简单的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 - 正确的答案应该是

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 运行相同的操作。

非常感谢理解并尝试解决这些想法,

bash shell cron almalinux
1个回答
0
投票

我安装了

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)
© www.soinside.com 2019 - 2024. All rights reserved.