杀死在后台运行且没有 PID 的 while 循环

问题描述 投票:0回答:6

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

我创建了一个在后台运行的“脚本”:

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

脚本的输出保存在用户主目录中的 alive.log 文件中。 问题是我不知道如何终止循环,因为它填满了我的磁盘空间,如果我想删除该文件,那么循环将创建一个新文件并按照我的要求用文本“我还活着”填充它它要做。

我尝试使用:

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" 时可以看到输出;

请问有什么建议吗?

linux bash loops pid kill
6个回答
2
投票

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

输入

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


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
投票

我决定在后台尝试一下你的“脚本”。当我跑步时

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

它将进程 ID 返回到标准输出,从而表明该进程正在后台运行。您可以通过以下方式终止此进程 ID:

kill <pid>

0
投票

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

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

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

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

感谢您的帮助!


0
投票

就我而言,我已将 while 循环重定向到一个文件,它仅在前台运行,但由于 VPN 断开连接,我在远程主机上的会话受到干扰,但不知何故它仍在后台运行并更新输出文件。而且它也没有显示在“top”命令(或)ps -ef | grep“while”中来杀死它。

我用来找出在后台不断更新文件的进程 ID (PID) 的解决方法是:使用“fuser”。 fusionr 输出正在访问/使用输出文件的 PID(此处:dev-dataquery.txt)。一旦我杀死了这些 PID,输出文件就停止更新。

while sleep 2; do  date ;curl `hostname -i`:8009/member|jq 2>/dev/null; done >/tmp/dev-dataquery.txt

fuser 命令(Find USER)是一个进程管理工具,它使用文件、目录或套接字来识别进程

fuser dev-dataquery.txt 
/tmp/dev-dataquery.txt: 3992317 4068085

kill -9 3992317
kill -9 4068085

-1
投票

我把这句话写在一个名为 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的大小不再增长。

© www.soinside.com 2019 - 2024. All rights reserved.