如何终止后台进程?

Moh*_*dar 264 command-line process kill job-control background-process

我已经在后台使用&. 突然停止下载。我想终止它的进程,然后重新运行命令。我怎样才能终止它?

我还没有关闭它的外壳窗口。但正如你所知,它不会停止使用Ctrl+CCtrl+ Z

slm*_*slm 345

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

方法#1 - ps

您可以使用该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)

方法#2 - pgrep

您还可以使用 找到进程 ID pgrep

例子

$ pgrep wget
1234

$ kill 1234
Run Code Online (Sandbox Code Playgroud)

方法#3 - pkill

如果您确定它是wget您唯一运行的,则可以使用该命令pkill按名称终止作业。

例子

$ pkill wget
Run Code Online (Sandbox Code Playgroud)

方法#4 - 工作

如果您在运行现在后台作业的同一个 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)

方法#5 - fg

您可以使用该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)

  • @MohammadEtemaddar - 对不起,额外的 e 是一个错字。应该读为`ps -eaf | grep [w]get`。选项位于 `ps` 手册页中。`人ps`。 (3认同)
  • `kill %%` 会杀死最后一个后台进程。重复它会杀死之前的一个,依此类推。`kill %1` 会杀死第一个后台进程。 (3认同)
  • @MohammadEtemaddar - 啊,ps 正在寻找 grep。这样做:`ps -eaef| grep [w]get`。 (2认同)
  • @avm - 它基本上欺骗“grep”,使其不在输出中显示实际的“grep”命令。“grep”命令显示为“grep [w]get”,但命令“grep”正在查找字符串“wget”。“[...]”是一组字符,在本例中是一组 1 个字符“w”。 (2认同)

Zel*_*lda 96

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

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

kill %1
Run Code Online (Sandbox Code Playgroud)

(用jobs给你的数字代替 1 )


小智 29

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

  • 如果它用作命令(如 bash 配置文件中的别名),请务必用单引号引起来。 (5认同)

ced*_*beu 7

这是一个老问题,已经很少有好的答案,但是,我会尝试以稍微不同的方式呈现我的答案。

实际上,后台进程称为jobs,作业控制在这 3 个简短的页面中得到了很好的解释:https ://www.gnu.org/software/bash/manual/html_node/Job-Control.html

基本上,我们可以通过jobspec来引用作业,即符号%后跟另一个符号(或者在某些更奇特的情况下是序列),或者是作业 ID。kill对于、fgbg或也是一样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)


Try*_*431 6

我在这里没有看到的一件事是pidof. 您可以使用它pidof [command]来查找当前正在运行的进程的进程 ID。我喜欢它,因为它可以让我快速找到我想要的命令的 id,这通常是我刚刚调用的命令。

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


Sła*_*art 6

在 bash 最后停止的进程(Ctrl-Z)中,您将通过以下方式杀死:

kill %%
kill -9 %%
Run Code Online (Sandbox Code Playgroud)

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

jobs

然后:

kill %N

喜欢kill %2