用于在Linux上获取进程ID的Shell脚本

sam*_*207 27 linux bash shell scripting

我想编写一个shell脚本(.sh文件)来获取给定的进程ID.我在这里尝试的是,一旦我获得进程ID,我想杀死该进程.我在Ubuntu(Linux)上运行.

我能用命令这样做

ps -aux|grep ruby
kill -9 <pid>
Run Code Online (Sandbox Code Playgroud)

但我不知道如何通过shell脚本来做到这一点.

Mar*_*air 36

在脚本中使用grep结果ps是个坏主意,因为在某些时候它也会与你刚刚调用的grep进程匹配.该命令pgrep可以避免此问题,因此如果您需要知道进程ID,那么这是一个更好的选择.(注意,当然,可能有许多进程匹配.)

但是,在您的示例中,您可以使用类似命令pkill来终止所有匹配的进程:

pkill ruby
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你应该知道,使用-9在几乎所有情况下被大材小用(嗬嗬) -有关于在"无用使用的文本一些有用的建议kill -9套用信函":

不不不.不要用kill -9.

它没有给这个过程一个干净的机会:

  1. 关闭套接字连接
  2. 清理临时文件
  3. 告诉它的孩子它会消失
  4. 重置其终端特性

依此类推等等.

一般情况下,发送15,等待一两秒,如果不起作用,发送2,如果不起作用,发送1.如果不成功,请删除二进制文件,因为程序运行不正常!

不要用kill -9.不要拿出联合收割机只是为了收拾花盆.


Mic*_*lon 18

如果您打算使用ps,grep那么您应该这样做:

ps aux|grep r[u]by
Run Code Online (Sandbox Code Playgroud)

这些方括号将导致grep跳过grep命令本身的行.所以要在脚本中使用它:

output=`ps aux|grep r\[u\]by`
set -- $output
pid=$2
kill $pid
sleep 2
kill -9 $pid >/dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

反引号允许您捕获shell变量中的命令输出.的set --解析ps输出成单词,和$ 2是其上恰好是PID行第二个字.然后你发送一个TERM信号,等待几秒钟让ruby关闭自己,然后如果它仍然存在则无情地杀死它,但扔掉任何输出因为大部分时间kill -9会抱怨该进程已经死了.

我知道我在方括号之前使用了没有反斜杠的东西,但刚才我在Ubuntu 12上检查了它似乎需要它们.这可能与bash的许多选项和不同Linux发行版上的默认配置有关.希望[和]可以在任何地方工作,但我不再访问服务器,我知道它没有反斜杠工作,所以我不能确定.

一条评论建议使用grep-v,这就是我过去常常做的事情,但是当我了解[]变体时,我认为最好在管道中产生少一个进程.

  • 这是一个很棒的例子来获取你的pid,虽然我认为它应该是2美元而不是1美元,一些修正如下:output =`ps -aux | grep r [u] by`; set - $ output; pid = $ 2; kill $ pid; sleep 2; kill -9 $ pid>/dev/null 2>&1 (2认同)
  • grep命令不搜索字符串,而是搜索正则表达式.方括号用于提供一组字符,其中任何一个字符都与模式匹配.当然,一个单个字符集只匹配该字符,并且由于ps使用方括号显示原始命令行内容,因此该正则表达式将与该命令行不匹配. (2认同)
  • 一种更明确的方法来排除grep命令本身'ps aux | grep ruby​​ | grep -v grep (2认同)

Fre*_*ihl 6

作为一个开始,没有必要做一个ps -aux | grep...命令pidof是更好的使用.而几乎从此再也kill -9这里

要从bash中获取命令的输出,请使用类似的内容

pid=$(pidof ruby)
Run Code Online (Sandbox Code Playgroud)

pkill直接使用.