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

Killing a while loop that's running in the background without a PID

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

我在后台创建了 "script" 运行:

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

脚本的输出保存在用户主目录中的文件 alive.log 中。 问题是我不知道如何终止循环,因为它填满了我的磁盘 space,如果我想删除文件,那么循环将创建一个新文件并用文本 "I'm alive" 填充它,因为我要求它做。

我尝试使用:

ps - aux | grep while

ps - aux | grep alive 

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

我也试过使用:

pkill while
killall while

两行的结果都是 0(使用 pkill while -c "0" 或 killall while 时可以看到输出:"while: no process found";

有什么建议吗?

我决定在后台试用您的 "script"。当我运行

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

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

kill <pid>

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

此外,在我摆脱它之后,我重新输入了脚本:

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

正如@ssharma 在输入脚本时所述,输出是一个 PID,即使循环不断更改 PID,我也能够使用该 PID 终止循环。

感谢您的帮助!

如果您 运行 该脚本将显示为 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[];next} /^james/ && $NF=="bash" &&  in a{print }' <(ps -ef) <(ps -ef)
27262
27359

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

我把这句话写在一个名为 while.sh 的脚本文件中,运行 它由 shell 编写:

[edemon@CentOS workspace]$ ./while.sh 
[edemon@CentOS workspace]$ 

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

  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 

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

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

键入 fg 将其置于前台并使用 ctrl-c 解决此问题的最快方法将其杀死。