杀死在没有PID的情况下在后台运行的while循环

时间:2017-08-01 14:11:51

标签: linux bash loops pid kill

我是Linux中所有内容的初学者,所以请慢慢来。

我创建了一个"脚本"那是在后台运行的:

while true; do echo "I'm alive" >> alive.log ; done &

脚本的输出保存在用户主目录中的文件alive.log中。 问题是我没有想法如何杀死循环,因为它填充了我的磁盘空间,如果我想删除文件,那么循环将创建一个新文件并用文本填充它"我&#39 ; m alive"正如我所要求的那样。

我尝试使用:

ps - aux | grep while

ps - aux | grep alive 

这两行的输出将给出我需要的PID,但问题是脚本是一个循环,这意味着PID每次运行时都会改变(递归),所以我不能使用PID杀死这个过程。

我也尝试过使用:

pkill while
killall while

两行的结果都是0(使用pkill时可以看到输出,而-c" 0"或killall while:" while:没有找到进程&#34 ;;

有什么建议吗?

5 个答案:

答案 0 :(得分:1)

如果您运行该脚本,如果您命令bash,它将显示为ps -ef

UID        PID  PPID  C STIME TTY          TIME CMD
james    27262  2448 98 17:35 pts/3    00:00:12 bash
james     2448  2446  0 Jul19 pts/3    00:04:49 bash

(如果您使用bash)并且其父pid也指向bash进程(PID 27262是您上面的紧密循环)。因此,查找具有bash进程的所有bash进程作为父进程。这可能有效:

$ awk '/^james/ && $NF=="bash" && NR==FNR{a[$2];next} /^james/ && $NF=="bash" && $3 in a{print $2}' <(ps -ef) <(ps -ef)
27262
27359

所以,那些是杀人的好人选。在这种情况下,另一个是ps -ef,另一个是标记。

答案 1 :(得分:1)

这是@James Brown在评论中的答案。

键入fg以将其置于前台并使用ctrl-c以最快的方式将其终止。

答案 2 :(得分:0)

我决定尝试你的&#34;脚本&#34;在后台。我跑的时候

while true; do echo "I'm alive" >> alive.log ; done &

它将进程ID返回到标准输出,从而显示进程在后台运行。您可以使用以下命令终止此进程ID:

kill <pid>

答案 3 :(得分:0)

尝试重新启动两次,第一次没有工作,但在第二次之后循环不再存在,文件将不会被重写。

此外,在我摆脱它后,我重新进入了剧本:

while true; do echo "I'm alive" >> alive.log ; done &

正如@ssharma所说,当输入脚本时,输出是一个PID,即使循环不断改变PID我也能够用该PID杀死循环。

感谢您的帮助!

答案 4 :(得分:0)

我在一个名为while.sh的脚本文件中编写了这个句子,并通过shell运行它:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                 
 4036 edemon    20   0  5268  756  436 R 97.3  0.0   0:07.93 bash                                                                    
 2469 root      20   0 94412  29m  10m S  7.8  2.0   1:49.19 Xorg                                                                    
 2788 edemon    20   0 74300  12m  10m S  1.9  0.9   1:38.79 nm-applet                                                               
 4040 edemon    20   0  2708 1072  796 R  1.9  0.1   0:00.01 top 

没有PID。 我使用top命令工具搜索我的while.sh,它告诉我:

{{1}}

while的父亲进程是bash,所以我杀了4036. alive.log的大小不再增长。