我正在尝试为bash中的程序创建一个初始化脚本。 (rhel6)
它首先检查进程。如果找到进程,它将回显该程序已经在线,如果没有找到,它将继续使用启动脚本以特定用户身份启动该程序。这样做之后,它应该尾随程序的日志文件,并一起检查字符串。如果找到这些单词,它应该杀死尾巴并回显该程序在线。
这是开始部分。
prog=someProg
user=someUser
threadCount=$(ps -ef | grep $prog |grep -v 'grep' |awk '{ print $2 }'| wc -l)
startb() {
if [ "$threadCount" -eq 2 ]; then
echo "$prog already online."
else
echo "Bringing $prog online."
su $user -c "/path/to/start/script.sh"
tail -f /path/to/$prog/log/file |
while IFS=$'\n' read line
do
if [[ $line == *started\ up\ and\ registered\ in* ]]; then
pkill tail
echo "$prog now online."
fi
done
fi
}
我的问题:
这是不可预测的。我也在停止段中实现了相同的逻辑,以监视日志,然后进行回显,但即使这样也可以与启动相同。只是随机的。
我确定这看起来可能很愚蠢和破损。这是通过用我的初学者bash技能在这里和那里挑选碎片来完成的。
预先感谢您的建议和帮助。
答案 0 :(得分:0)
对于“ grep $ prog”,我无法重现您遇到的错误...抱歉。
但另一方面。
我将假设以su行开头的脚本正在后台启动,并且脚本本身会结束。如果没有,您的示例将无限期等待。
可以是个人喜好,但是当我使用诸如tail之类的东西来验证行时,我使用了命名管道(mkfifo)。
那会给出类似的东西:
# Getting the tail in background
tail -f /path/to/$prog/log/file > some_fifo &
# Getting the tail PID
tailPID=$!
while read line; do #You don't need to modify/use IFS here.
if [[ $line == *started\ up\ and\ registered\ in* ]]; then
kill -15 $tailPID #since you know the PID you won't kill another tail
echo "$prog now online."
break # don't like the possibility, even remote, of an infinite loop :)
fi
done < some_fifo #reading from the named pipe
希望它可以为您提供帮助