我已经使用&在后台的远程计算机上启动了wget。突然,它停止下载。我想终止其过程,然后重新运行命令。如何终止它?

我还没有关闭其外壳窗口。但正如您所知,使用Ctrl + C和Ctrl + Z并不会停止。

#1 楼

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

方法#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-pkill

如果您确定这是唯一的wget您已运行,可以使用命令pkill按名称杀死该作业。

示例

$ pkill wget


方法#4-作业

如果您位于与运行后台程序的位置相同的Shell中。您可以使用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
$


评论


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

–slm♦
2013年12月12日上午7:34

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

–slm♦
2013年12月12日上午7:54

@MohammadEtemaddar-您也可以改用pgrep,即pgrep wget。

–slm♦
2013年12月12日上午7:56

@MohammadEtemaddar-对不起,多余的e是一个错字。应该读ps -eaf | grep [w]获取。这些选项位于ps手册页中。男子ps

–slm♦
2013年12月12日上午8:01

kill %%杀死最后一个后台进程。重复它会杀死之前的一个,依此类推。 kill%1杀死第一个后台进程。

–Ronny Sherer
20-2-5在12:06

#2 楼

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

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

kill %1


(用1替换为jobs给您的数字)

#3 楼

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

评论


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

– Nate Ritter
19-09-27在20:57

#4 楼

编辑:进入前台后,您可以按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.


#5 楼

正确的方法是键入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


#6 楼

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

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

评论


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

–mjohnsonengr
17 Mar 23 '17 at 15:47

#7 楼

一个常见的示例是stress工具。假设您运行了以下命令:

$ stress -c 4 -m 4 


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

我的工作:

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


pgrep列出了所处理过程的PID和将其存储到变量x中,然后kill -9使用该变量终止它。

#8 楼

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

kill %%
kill -9 %%


,或者如果要选择,请使用: br />
然后:

jobs

kill %N

#9 楼

最简单的方法是在-9命令上使用kill标志

user@host:/path> jobs
[1]+  Running                 /usr/home/script1.sh $i &
user@host:/path> fg
/usr/home/script1.sh $i
^C
[1]+  Stopped                 /usr/home/script1.sh $i
user@host:/path> kill -9 %1
[1]+  Stopped                 /usr/home/script1.sh $i
user@host:/path>
[1]+  Killed                  /usr/home/script1.sh $i
user@host:/path>
user@host:/path> jobs
user@host:/path>