我开始了一个while循环,如下所示:
while true; do {command}; sleep 180; done &
注意&
.
我想当我杀死终端时,这个while循环会停止。但它仍在继续。自从我终止终端会话以来已经有几个小时了。
如何停止这个while循环?
我开始了一个while循环,如下所示:
while true; do {command}; sleep 180; done &
注意&
.
我想当我杀死终端时,这个while循环会停止。但它仍在继续。自从我终止终端会话以来已经有几个小时了。
如何停止这个while循环?
我已开始
并关闭终端进行测试,现在我遇到了同样的问题。
如果您已经关闭了终端,那么您已经开始了循环
让我们用 来概述正在运行的进程
ps fjx
,我机器上的最后几行是您可以将
yad
其视为 的子进程/bin/bash
,如果我关闭yad
它,它会sleep 60
在 的输出中变为ps
。如果树视图太混乱,您还可以按如下方式搜索输出1:输出行以两个数字开头,第一个是 PPID,父进程的进程 ID,第二个是 PID,进程本身的 ID。这是因为它
9411
出现在此处的两行中:那就是
bash
我们想要杀死的子shell,我们刚刚发现了它的PID,所以现在剩下的一切都是一个简单的烦人的 subshell 已经一去不复返了。
1:符号 as
grep "[y]ad"
而不是简单地grep yad
阻止grep
进程本身出现在结果列表中。如果您的终端仍然打开
bash
提供了变量$!
,它“扩展为最近放入后台的作业的进程 ID”,因此以下只是杀死后台的最新进程:如果它不是最新进程,则可以使用
jobs
内置的示例输出获取正在运行的作业列表:作业列表中有两个作业,要终止其中一个,您可以使用作业编号或快捷方式访问它
%
,%+
(“当前作业”)和%-
(“上一个作业”),例如终止在后台运行的循环能做并终止暂停的
sleep 10
工作:我需要注意的是,当您关闭输入该命令的终端时,该子命令应该随之消失。试图重现这一点表明了这种行为。
现在,假设您确实处于没有发生这种情况的情况下,一种杀死您在后台运行的程序的方法,这是由
&
命令末尾的 引起的,如下所示:echo $$
以记下您当前的 PID(进程 ID),这样您就不会终止自己的会话。ps -ef | grep $SHELL
命令来查找哪些程序正在运行 shell。echo $$
;这是您要杀死的PID。kill -SIGTERM <pid>
命令,<pid>
您在步骤 #3 中确定的数值在哪里您也可以重新启动会话或计算机,但以上将允许您避免这种情况。
这
&
将使终端创建一个新进程并让您的代码在其中运行。所以你的代码变得独立于终端进程。即使您关闭终端,运行代码的新进程也不会停止。所以要么删除&
要么做ps -aux
,找到你的进程并杀死它kill (process id)
。