为什么“作业-p | 杀-n 15“不起作用?

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

我正在尝试安装RVM (Ruby版本pipe理器)。

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

但是当我想以退出命令退出terminal时,我收到一条消息,说我已经停止了工作:

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

在这里,我读了如何杀死停止的工作:

 kill `jobs -p` 

但我决定尝试用pipe道命令的语法,我在这里读到:

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

所以我做了这些尝试,但不能得到所需的结果:

 $ 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命令,它应该杀死这个工作。 但是这并没有发生。 为什么? 在这种情况下是否可以使用pipe道?

  • 命令有几个标准stream:标准输出(标准输出),标准input(标准input)和标准错误(标准错误)。
  • pipe道将命令的stdout发送到另一个命令的stdin
  • 杀死通过它的参数列表,而不是任何“标准”stream
  • 有些命令允许你在参数上指定“ – ”来接受来自stdin的input作为参数(而不是kill命令)
  • 如果你想把stdoutpipe道到另一个参数列表,你可以使用xargs ,但是当有潜在的空间时(有时在其他情况下 ),必须小心。

在你的情况下,作业-p不应该有任何与xargs问题,你可以使用以下内容:

 jobs -p | xargs kill 

如果你喜欢,你也可以使用–verbose(或者-t)

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

xargs是一个强大的工具。 要非常小心地将input传递给它( find -print0grep -Zxargs -0在处理文件时相处得很好)。 它非常值得使用它(有时节省时间)。

kill不会从标准input中获取参数,如果您按照您的要求进行pipe道input,那么它们将出现在哪里。 使用kill的唯一方法是将PID或PID列表指定为命令行参数。

如果SIGTERM(-15)不起作用,请尝试SIGKILL(-9)。 build议尽量先尝试SIGTERM。

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

在这种情况下,你可以input:fg,然后按ctrl-C。

如果你想直接杀死你的剩余进程,在bash下,你可以很容易地发出:

 kill %1 

这将杀死后台的第一个进程,如工作确定。