linux:杀死后台任务

fly*_*ire 188 unix linux bash kill job-control

如何杀死linux中最后生成的后台任务?

例:

doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 285

您可以按工作号码杀死.当你在后台放置一个任务时,你会看到类似的东西:

$ ./script &
[1] 35341
Run Code Online (Sandbox Code Playgroud)

[1]是工号,可以像:

$ kill %1
$ kill %%  # Most recent background job
Run Code Online (Sandbox Code Playgroud)

要查看作业号列表,请使用该jobs命令.更多来自man bash:

有很多方法可以引用shell中的作业.角色%引入了一个工作名称.工作号码n可以称为%n.也可以使用用于启动它的名称的前缀或使用其命令行中出现的子字符串来引用作业.例如,%ce指的是已停止的ce作业.如果前缀匹配多个作业,则bash报告错误.使用%?ce,在另一方面,是指包含字符串的任何作业ce在其命令行.如果子字符串匹配多个作业,bash会报告错误.符号%%%+引用shell的当前作业的概念,这是在前台或在后台启动时停止的最后一个作业.可以使用以前的作业来引用%-.在与作业相关的输出(例如,作业命令的输出)中,当前作业始终标记为a +,而前一个作业标记为a -.单个%(没有伴随的工作规范)也指当前的工作.

  • 非常有用的符号,这些`%1`和`%%` - 尤其如此.有些东西不会在Ctrl-C上死掉,所以你需要按Ctrl-Z它们,然后`kill -9 %%`.我发现它有用的一个例子是:`while true; 做mplayer <一些不稳定的在线广播>; date >> restarts.log; 完成` - Ctrl-C只会让你进入下一个循环迭代.在我不得不做`ps`或者`jobs -l`之前,然后重新输入PID,这很乏味. (8认同)
  • @TomaszGandor这就是为什么你可能想用`while sleep 1`替换`while true`.如果您可以使用它,这将在重新启动之前给您一个短暂的延迟,如果您按两次ctrl-c,第二个将中断睡眠,以非零退出结束并且退出循环. (3认同)
  • 根据记录,我认为这仅在启用作业控制时才有效。尽管我认为您可以在脚本中打开它(“set -m”),但它是用于交互式使用的。另请参阅http://stackoverflow.com/questions/690266/why-cant-i-use-job-control-in-a-bash-script (2认同)

fal*_*tro 229

在bash中有一个特殊的变量:

kill $!
Run Code Online (Sandbox Code Playgroud)

$!扩展到后台执行的最后一个进程的PID.

  • @ polm23; 不,`^ Z`不是后台作业,它会阻止它们.随后的`bg`执行实际的'背景'(在后台恢复执行),之后`$!`按预期工作. (66认同)
  • 这不适用于以`^ Z`为后台的作业. (19认同)
  • 完成:由于单个%也指当前作业,因此您可以使用“ kill%”杀死已停止的作业(^ z)。我几乎总是在^ z之后使用它。 (2认同)

Dav*_*ogt 45

以下命令为您提供会话中所有后台进程的列表以及pid.然后,您可以使用它来终止进程.

jobs -l
Run Code Online (Sandbox Code Playgroud)

用法示例:

$ sleep 300 &
$ jobs -l
[1]+ 31139 Running                 sleep 300 &
$ kill 31139
Run Code Online (Sandbox Code Playgroud)


Pra*_*Are 25

这应该会杀死所有后台进程:

jobs -p | xargs kill -9
Run Code Online (Sandbox Code Playgroud)

  • @TomaszGandor这将只杀死当前作业,即上一个作业在前台停止或在后台启动.答案中的命令将终止所有作业. (4认同)
  • [不要杀掉-9](http://unix.stackexchange.com/questions/8916/when-should-i-not-kill-9-a-process) (4认同)