在没有 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
解决此问题的最快方法将其杀死。
我对 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
解决此问题的最快方法将其杀死。