为什么“jobs -p | kill -n 15”不起作用?

为什么“jobs -p | kill -n 15”不起作用?

我对 Linux 还很陌生。事实上,我现在使用的是 Cygwin,而不是 Linux 本身。

我正在尝试安装右心室(Ruby 版本管理器)。

我正在执行rm -r ./.rvm -i命令。我想删除.rvm文件夹,看看我被要求删除还是不删除文件/目录。我看到了一些,并用它停止了Ctrl+Z,然后用 Windows Explored 删除了整个.rvm文件夹,只是把它发送到回收站。

但是当我想用命令退出终端时,exit我收到一条消息,说我已停止作业:

$ jobs
[1]+  Stopped                 rm -r ./.rvm -i

这里我读了如何终止已停止的工作:

kill `jobs -p`

但我决定尝试使用我读到的管道命令语法这里

管道中每个命令的输出通过管道连接到下一个命令的输入

因此我做了这些尝试,但未能得到预期的结果:

$ jobs -p | kill
$ jobs -p | kill -n 15 # 15 is SIGTERM signal
$ jobs -p | kill -n=15 # got error wrong signal spec
$ jobs -p | kill -s SIGTERM

我不明白为什么它不起作用。jobs -p列出进程 ID:

$ jobs -p
340

因此,该340ID 必须转到kill -n 15命令,并且应该终止该作业。但这并没有发生。为什么?在这种情况下可以使用管道吗?

答案1

  • 命令有几个标准流:标准输出 (stdout)、标准输入 (stdin) 和标准错误 (stderr)。
  • 管道将一个命令的标准输出发送到另一个命令的标准输入
  • Kill 通过其参数列表获取参数,而不是任何“标准”流
  • 某些命令允许您在参数上指定“-”,以接受来自 stdin 的输入作为参数(而不是命令kill
  • 如果要将 stdout 传送到另一个参数列表,则可以使用xargs,但必须小心存在潜在空格的情况——有时在其他情况下)。

就您而言,jobs -p 不应该与 xargs 有任何问题,您可以使用以下命令:

jobs -p | xargs kill

如果您愿意,您还可以使用 --verbose (或 -t)查看它执行的确切命令

jobs -p | xargs --verbose kill
jobs -p | xargs -t kill

xargs是一款功能强大的工具。在向其传递输入时要非常小心(find -print0grep -Z,并且xargs -0在处理文件时也能很好地处理)。它非常值得您付出努力去利用(有时还能节省时间)。

答案2

kill不从标准输入获取参数,如果您像之前一样通过管道传输参数,它们将出现在标准输入中。唯一的使用方法kill是指定 PID 或 PID 列表作为命令行参数。

答案3

如果 SIGTERM (-15) 不起作用,则尝试 SIGKILL (-9)。不过建议先尝试 SIGTERM。

 kill `jobs -p`
 kill -9 `jobs -p`

答案4

在这种情况下,您只需输入:fg,然后按 ctrl-C。

如果你想直接终止剩余的进程,在 bash 下,你可以轻松发出:

kill %1

这将终止由作业标识的后台第一个进程。

相关内容