如何在Linux中终止最后一个生成的后台任务?
示例:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
如何在Linux中终止最后一个生成的后台任务?
示例:
doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
你可以使用作业号来终止进程。当你将一个任务放到后台时,你会看到类似如下的内容:
$ ./script &
[1] 35341
[1]
是工作号,可以像这样引用:
$ kill %1
$ kill %% # Most recent background job
jobs
命令。更多内容请参见man bash
:%
引入了作业名称。作业号n
可以表示为%n
。还可以使用启动它的名称前缀或使用出现在其命令行中的子字符串来引用作业。例如,%ce
表示已停止的ce
作业。如果前缀匹配了多个作业,bash会报错。另一方面,使用%?ce
表示任何包含字符串ce
在其命令行中的作业。如果子字符串匹配了多个作业,bash也会报错。符号%%
和%+
指的是shell对当前作业的概念,即在前台停止或在后台启动的最后一个作业。以前的作业可以使用%-
引用。在有关作业的输出(例如jobs命令的输出)中,当前作业始终带有一个+
标记,以前的作业带有一个-
标记。单个%
(没有附带的作业规范)也表示当前作业。set -m
),但它是用于交互式使用的。请参见https://dev59.com/inRB5IYBdhLWcg3wNk53 - falstro%1
和 %%
特别实用。有些进程无法通过 Ctrl-C 结束,你需要使用 Ctrl-Z 暂停它们,然后使用 kill -9 %%
命令强制结束它们。我发现一个很有用的例子是:while true; do mplayer <some unstable online radio>; date >> restarts.log; done
- 使用 Ctrl-C 只能让代码进入下一个循环迭代。以前我不得不使用 ps
或者 jobs -l
命令查询 PID,并重新输入它,这很繁琐。 - Tomasz Gandorwhile sleep 1
替换while true
。如果你可以接受这个短暂的延迟,那么它会在重新启动之前等待一段时间。如果你按两次ctrl-c,第二次将中断睡眠,并以非零退出码结束,跳出循环。 - falstrokill: failed to parse argument: '%1'
"(例如,在 sudo less /media/someUser/364c375a-523c-41ae-b858-0fa9774540a3/grub/grub.cfg
中按下 Ctrl + Z 后执行 sudo kill %1
命令)。 kill %1
(不带 sudo
)也可以产生所需的结果,但会显示一个错误信息: "bash: kill: (23076) - Operation not permitted.
和 [1]+ Stopped sudo less /media/someUser/364c375a-523c-41ae-b858-0fa9774540a3/grub/grub.cfg
"。 - Peter Mortensenkill $!
$! 会扩展为在后台执行的最后一个进程的 PID。
^Z
并不是将作业放到后台运行,它会停止它们。接下来执行 bg
命令才能让作业在后台继续执行,并且此后 $!
才能正常使用。 - falstro????
代表在kill之后要执行一个或多个命令,如果其中任何一个命令依赖于后台进程完成的工作,请注意后台进程在接收到(可捕获的)信号后在信号处理程序中执行的任何清理或完成任务。最好在任何此类“依赖”命令的第一个命令之前添加一个wait
(可能跟随一个sync
甚至是一个sleep <n>
)。 - ack以下命令可以列出您会话中所有后台进程及其pid。您随后可以使用它来终止该进程。
jobs -l
使用示例:
$ sleep 300 &
$ jobs -l
[1]+ 31139 Running sleep 300 &
$ kill 31139
这将终止所有后台进程:
jobs -p | xargs kill -9
kill -9 %%
打字更少 :) - Tomasz Gandorskill doB
skill
是 kill 命令的一个版本,它允许你根据给定的条件选择一个或多个进程。
如John Kugelman的回答所述,%
与工作规范有关。
我们如何高效地找到它?使用less的 &pattern 命令。似乎man使用了less分页器(我不太确定)。在'man' Bash中,键入&%,然后键入Enter。它只会显示包含“%”的行。要重新显示所有内容,请键入&。然后再次键入Enter。
只需使用killall命令:
killall 任务名称
要获取更多信息和更高级的选项,请键入“man killall”。
killall python
жҲ–иҖ…killall java
е‘Ҫд»ӨпјҢиҖҢеңЁзі»з»ҹзҡ„е…¶д»–ең°ж–№жңүдёҖдәӣжңүз”Ёзҡ„зЁӢеәҸжӯЈеңЁиҝҗиЎҢпјҢиҝҷж ·еҒҡе°ұдёҚеӨӘеҗҲйҖӮдәҶгҖӮ - Tomasz Gandor