Moh*_*dar 264 command-line process kill job-control background-process
我已经在后台使用&. 突然停止下载。我想终止它的进程,然后重新运行命令。我怎样才能终止它?
我还没有关闭它的外壳窗口。但正如你所知,它不会停止使用Ctrl+C和Ctrl+ Z。
slm*_*slm 345
有很多方法可以解决这个问题。
您可以使用该ps命令查找此进程的进程 ID,然后使用 PID 杀死该进程。
$ ps -eaf | grep [w]get
saml 1713 1709 0 Dec10 pts/0 00:00:00 wget ...
$ kill 1713
Run Code Online (Sandbox Code Playgroud)
您还可以使用 找到进程 ID pgrep。
$ pgrep wget
1234
$ kill 1234
Run Code Online (Sandbox Code Playgroud)
如果您确定它是wget您唯一运行的,则可以使用该命令pkill按名称终止作业。
$ pkill wget
Run Code Online (Sandbox Code Playgroud)
如果您在运行现在后台作业的同一个 shell 中。您可以使用该jobs命令检查它是否仍在运行,还可以通过其作业号杀死它。
我的假工作,sleep。
$ sleep 100 &
[1] 4542
Run Code Online (Sandbox Code Playgroud)
找到它的工作号。注意:数字 4542 是进程 ID。
$ jobs
[1]+ Running sleep 100 &
$ kill %1
[1]+ Terminated sleep 100
Run Code Online (Sandbox Code Playgroud)
您可以使用该fg命令将后台作业带回前台。
假工作,sleep。
$ sleep 100 &
[1] 4650
Run Code Online (Sandbox Code Playgroud)
获取工作编号。
$ jobs
[1]+ Running sleep 100 &
Run Code Online (Sandbox Code Playgroud)
将作业 #1 带回前台,然后使用Ctrl+ C。
$ fg 1
sleep 100
^C
$
Run Code Online (Sandbox Code Playgroud)
Zel*_*lda 96
在 bash 中,您可以使用fg将作业置于前台,然后使用Ctrl+C
或者在后台列出进程jobs然后执行
kill %1
Run Code Online (Sandbox Code Playgroud)
(用jobs给你的数字代替 1 )
这是一个老问题,已经很少有好的答案,但是,我会尝试以稍微不同的方式呈现我的答案。
实际上,后台进程称为jobs,作业控制在这 3 个简短的页面中得到了很好的解释:https ://www.gnu.org/software/bash/manual/html_node/Job-Control.html
基本上,我们可以通过jobspec来引用作业,即符号%后跟另一个符号(或者在某些更奇特的情况下是序列),或者是作业 ID。kill对于、fg、bg或也是一样disown。
%+(或只是%, 或%%)将引用最新的后台作业(当前)%-将参考上一篇%{jobid}将引用指定的作业要列出后台作业,请使用命令jobs。
kill $!有不同的行为,它将杀死在后台作为作业发送的最新进程,而不是创建的最新作业。
您已在后台发送了 5 个作业。
您将作业#2 带回前台(fg %2,或只是%2),然后将其发送回后台(<Ctrl-Z>,然后bg)。
这是发送到后台的最新进程,但它仍然是作业 #2。
因此,这kill $!将终止作业#2——(重新)发送到后台的最新进程,同时kill %+将终止作业#5,即已创建的最新作业(“当前作业”):
$ 职位 [1] 运行睡眠 1000 & [2] 跑步睡眠 2000 & [3] 跑步睡眠3000& [4]- 运行睡眠 4000 & [5]+ 跑步睡眠 5000 & $ fg %2 睡觉2000 ^Z [2]+ 停止睡眠 2000 $ 背景 [2]+ 睡眠 2000 & $ 职位 [1] 运行睡眠 1000 & [2] 跑步睡眠 2000 & [3] 跑步睡眠3000& [4]- 运行睡眠 4000 & [5]+ 跑步睡眠 5000 & $杀死%+ $ 职位 [1] 运行睡眠 1000 & [2] 跑步睡眠 2000 & [3] 跑步睡眠3000& [4]- 运行睡眠 4000 & [5]+ 终止睡眠 5000 $杀$! [2] 终止睡眠 2000 $ 职位 [1] 运行睡眠 1000 & [3]- 运行睡眠 3000 & [4]+ 跑步睡眠 4000 &
小智 6
编辑:一旦进入前台,您可以Ctrl+ C,或者如@Zelda 提到的那样,使用 '%x' 杀死,其中 'x' 是作业编号将发送默认信号(在 Linux 的情况下很可能是 SIGTERM)。
只需键入fg即可将其置于前台,如果它是您后台处理的最后一个进程(使用“&”)。
如果它不是最后一个,请输入:jobs并找到“工作编号”,用“[]”表示。然后只需键入:
fg 2
Run Code Online (Sandbox Code Playgroud)
..其中“2”是工作编号,例如:
foo@bar:~/junk/books$ jobs
[1]+ Running okular how_to_cook_a_turkey.pdf &
foo@bar:~/junk/books$ fg 1
okular how_to_cook_a_turkey.pdf <- this is now in the foreground.
Run Code Online (Sandbox Code Playgroud)
我在这里没有看到的一件事是pidof. 您可以使用它pidof [command]来查找当前正在运行的进程的进程 ID。我喜欢它,因为它可以让我快速找到我想要的命令的 id,这通常是我刚刚调用的命令。
一旦你有了 pid,你就可以简单地终止该进程。它允许创建简单的脚本来杀死当前正在运行的进程。
在 bash 最后停止的进程(Ctrl-Z)中,您将通过以下方式杀死:
kill %%
kill -9 %%
Run Code Online (Sandbox Code Playgroud)
或者如果想选择,请使用:
jobs
然后:
kill %N
喜欢kill %2