我运行一个命令后立即获得一个日志文件(进程仍在后台运行)。现在我想从该日志文件中获取状态(干净或不干净)。如果状态是干净的,那么我将保持进程原样;否则,如果它不干净,那么我必须终止由我的第一个命令启动的进程,然后再次重新运行相同的命令。
我已经尝试过了cat logfilename | grep "un-clean"
。但我不知道如何在 shell 脚本中验证这个输出。
我想要的是(大致)var= clean then the output of above command == var if yes then echo "ok" else re-run command
我尝试了一些命令,但对我来说不起作用。
答案1
基本上,你想要这个结构
if grep -q "un-clean" /path/to/log_file.log ;
then
# put some command in case we find result is unclean
else
# if the output is ok, do something else
fi
它所做的只是默默地(不打印到屏幕上)检查文件中是否有字符串“unclean”匹配。如果有,我们执行 if 部分,否则 - 我们执行 else 部分。
以下是一个例子:
$> if grep -q 'root' /etc/passwd ; then echo "This user exists" ; else echo "This user doesn't exist"; fi
This user exists
$> if grep -q 'NOEXIST' /etc/passwd ; then echo "This user exists" ; else echo "This user doesn't exist"; fi
This user doesn't exist
您还可以做的是从脚本启动您想要的命令,但在后台。这样我们就可以得到它的 PID。这就是我的意思
$> echo "HelloWorld" &
[1] 6876
添加&
导致echo "HelloWorld"
在后台运行,并且我们将其 PID 存储在$!
变量中。因此,我们可以执行以下操作:
some-command &
CMD_PID=$!
if grep -q "un-clean" /path/to/log_file.log ;
then
kill -TERM $CMD_PID
else
# if the output is ok, do something else
fi
答案2
您是否尝试过这样的事情:
some-command &
PID=$!
wait $PID
while grep -q un-clean filename.log ; do
kill -TERM $PID
some-command &
PID=$!
wait $PID
done
当文件包含字符串时,该进程将被终止(参见killall
:)man killall
并且命令将运行。re-run
filename.log
un-clean
这有帮助吗?
编辑:使用好的@Serg 解决方案更新帖子,并添加了wait
在检查日志文件之前等待命令结束的命令。