我做了一些愚蠢的事情,运行了一个 awk,它运行一个 while 循环,每 10 秒发送一封电子邮件。我将其作为后台进程运行:
egrep '^[1-9]' /etc/hosts | grep -v 'localhost' | awk '{ system("ssh "$1" \42\while (true); do uptime > /home/dan/test.txt; grep \x60\hostname\x60 /etc/hosts >> /home/dan/test.txt; echo >> /home/dan/test.txt; echo >> /home/dan/test.txt; /home/dan/myscript.pl | grep FAIL -A1 >> /home/dan/test.txt;echo >>/home/dan/test.txt; if [[ $(grep FAIL /home/dan/test.txt) != \x22\x22 ]]; then sendmail [email protected] < /home/dan/test.txt; fi;sleep 10; done\42 &"); print "" }'
我意识到我做错了什么,因为一堆电子邮件进来了,但我想如果我简单地关闭外壳就可以停止它。那行不通。我尝试执行其他 awks,运行 ps-efw 和 grep 来查找该命令中的关键字,以防可能正在运行,然后对其运行kill -9。什么也没有出现。我检查了while
,dan
,sendmail
,myscript.pl
:
egrep '^[1-9]' /etc/hosts | grep -v 'localhost' | awk '{ system("ssh "$1" \42 ps -efw | grep sendmail\42");}'
我认为我的下一个赌注是检查在这些盒子上发送邮件的进程,然后杀死或阻止它。我不知道如何才能做到这一点,因为 ps aux 中没有显示任何内容。
答案1
脚本通常会执行“sleep 10”。首先将它们置于停止状态:
pkill -ef --signal STOP 'sleep 10'
这将阻塞 while 循环。使用ps -ef
或类似的方法查找睡眠的父 ID(PPID 列)并终止该进程和睡眠。父进程将是您的 shell,例如bash
,它正在执行while
您找不到的命令。
ps
在使用以下方法找到的进程 ID找到其父级后,您可以使用挂断信号杀死父级pgrep
:
kill -hup $(ps -h -o ppid $(pgrep -f 'sleep 10'))