如何终止后台进程?


Answers:


255

有很多方法可以解决此问题。

方法#1-ps

您可以使用该ps命令找到该进程的进程ID,然后使用PID终止该进程。

$ ps -eaf | grep [w]get 
saml      1713  1709  0 Dec10 pts/0    00:00:00 wget ...

$ kill 1713

方法2-pgrep

您也可以使用查找进程ID pgrep

$ pgrep wget
1234

$ kill 1234

方法#3-杀死

如果确定只有它wget运行过,则可以使用该命令pkill按名称杀死该作业。

$ pkill wget

方法4-作业

如果您与运行后台作业的外壳位于同一外壳中。您可以使用jobs命令检查它是否仍在运行,也可以通过其作业号将其杀死。

我的假工作sleep

$ sleep 100 &
[1] 4542

找到它的工作编号。注意:数字4542是进程ID。

$ jobs
[1]+  Running                 sleep 100 &

$ kill %1
[1]+  Terminated              sleep 100

方法5-FG

您可以使用以下fg命令将后台作业重新带到前台。

伪造的工作sleep

$ sleep 100 &
[1] 4650

获取工作编号。

$ jobs
[1]+  Running                 sleep 100 &

将作业#1重新放到前台,然后使用Ctrl+ C

$ fg 1
sleep 100
^C
$

jobs没有outputfg 赛斯:-bash: fg: 1: no such job。但是键入fg效果很好,效果也pkill wget很好。但是ps -eaf|grep wget然后并kill <process number>没有停止工作。ps:我将第三个数字用作进程号
Mohammad Etemaddar

1
@MohammadEtemaddar-使用的输出中的第二个数字ps。第三个#是父级的进程ID。
slm

1
@MohammadEtemaddar-啊,ps正在找到grep。这样做:ps -eaef| grep [w]get
slm

1
@MohammadEtemaddar -你也可以使用pgrep来代替,pgrep wget
slm

2
@MohammadEtemaddar-对不起,多余的e是一个错字。应该阅读ps -eaf | grep [w]get。这些选项在ps手册页中。man ps
slm

70

在bash中,您可以使用fg将该工作放在前台,然后使用Ctrl+C

或在后台列出进程jobs,然后执行

kill %1

(用数字代替1 jobs给您)


13

您也可以kill $!用来杀死最近后台的作业。


如果将它用作bash配置文件中的别名之类的命令,请确保使用单引号引起来。
Nate Ritter

6

编辑:进入前台后,您可以Ctrl+ C,或者如@Zelda所述,用'%x'杀死,其中'x'是作业号将发送默认信号(对于Linux,最可能是SIGTERM)。

fg如果它是您后台的最后一个进程(带有“&”),只需键入以将其置于前台。

如果不是最后一个,请键入:jobs并找到以[[]]表示的'职位编号'。然后只需输入:

fg 2

..其中“ 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.

4

正确的方法是键入jobs然后使用作业号将其杀死。为了使用pid杀死它,您需要按照第一个答案中所述将它带到前台。

尝试这个

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

/Desktop$ kill %1  #(%1 is the job number)

如果您在杀死它后立即运行工作,则应该看到此信息

Desktop$ jobs
[1]+  Terminated              sleep 1000

4

我在这里看不到的一件事是,尤其是在测试命令时,我发现它非常有用pidof。您可以pidof [command]用来查找当前正在运行的进程的进程ID。我喜欢它,因为它可以让我快速找到所需命令的ID,通常是我刚刚调用的ID。

一旦有了pid,您就可以简单地终止该进程。它允许创建简单的脚本以仅在进程当前正在运行时才杀死该进程。


1
啊,这对我有帮助!由于某些原因,kill%1无效,“ kill:无法解析参数'%1'”,并且Ctrl + C无效;在ps或其他任何东西中找不到进程,因为它是根目录(我忘了我在其中使用sudo)
mjohnsonengr

1

一个常见的例子是stress工具。假设您执行了以下操作:

$ stress -c 4 -m 4 

并关闭终端窗口。该过程将继续从后台消耗您的资源。

她是我的工作:

$ x=`pgrep stress` ; sudo kill -9 $x 

pgrep列出受处理进程的PID,并将其存储到变量中x,然后由变量用于kill -9终止它。


0

在bash最后停止的进程(Ctrl-Z)中,您将被杀死:

kill %%
kill -9 %%

或者,如果要选择,请使用:

jobs

然后:

kill %N

喜欢 kill %2

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.