我对 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
因此,该340
ID 必须转到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 -print0
、grep -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
这将终止由作业标识的后台第一个进程。