我希望在其他用户的进程终止或完成后收到我的电子邮件通知。我可以通过其进程ID或“top”命令中出现的进程名称来识别另一个用户的进程。
为了做同样的事情,我编写了以下脚本:
while true; do
if ps -ef | grep -q 'process_name'; then
sleep 1
else
echo "complete" | mail -s "process exiting" abc@gmail.com
fi
done
但是,我发现即使在其他用户的流程完成或其他用户杀死他或她的流程后,我仍然没有收到任何通知或电子邮件。有人可以帮我解决这个问题。
答案 0 :(得分:3)
问题很可能是这个检查:
if ps -ef | grep -q 'process_name'; then
始终为true
。为什么?只需在命令行上直接运行它,而不是-q
到grep
,这很明显:
$ ps -ef | grep 'process_name'
user 4550 3349 0 09:17 pts/0 00:00:00 grep --colour=auto process_name
$ echo $?
0
以上示例显示grep
将始终成功,因为它找到了自己!
有很多方法可以解决这个问题。一种方法是使用pgrep
代替grep
。
if pgrep 'process_name' > /dev/null; then
答案 1 :(得分:2)
防止grep
进程自身匹配的另一种常用技巧是用[]
围绕模式中的一个字母,如下所示:
grep -q '[p]rocess_name'
如果你知道这个过程,那么你根本不需要grep
,你可以使用ps
本身的退出代码:
if ps -p pid &> /dev/null; then
sleep 1
其中pid当然是进程ID。