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

时间:2011-06-22 09:19:20

标签: linux bash shell scripting

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

我能够通过像

这样的命令来做到这一点
ps -aux|grep ruby
kill -9 <pid>

但我不确定如何通过shell脚本来实现。

9 个答案:

答案 0 :(得分:36)

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

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

pkill ruby

顺便提一下,你应该知道在几乎每种情况下使用-9都是过度的(ho ho) - 在“{无效使用kill -9表格信件”的文本中有一些有用的建议:

  

不不不。请勿使用kill -9

     

它不会让这个过程有机会干净利落:

     
      
  1. 关闭套接字连接
  2.   
  3. 清理临时文件
  4.   
  5. 告知其子女它会消失
  6.   
  7. 重置其终端特征
  8.         

    依此类推等等。

         

    一般情况下,发送15,然后等待一两秒,如果不是这样   工作,发送2,如果不起作用,发送1.如果没有,   删除二进制文件是因为该程序表现不佳!

         

    请勿使用kill -9。不要带出联合收割机只是为了整洁   花盆。

答案 1 :(得分:18)

如果您要使用psgrep,那么您应该这样做:

ps aux|grep r[u]by

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

output=`ps aux|grep r\[u\]by`
set -- $output
pid=$2
kill $pid
sleep 2
kill -9 $pid >/dev/null 2>&1

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

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

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

答案 2 :(得分:6)

首先,不需要执行ps -aux | grep...使用命令pidof要好得多。几乎从来没有kill -9here

从bash中获取命令的输出,使用类似

的内容
pid=$(pidof ruby)

或直接使用pkill

答案 3 :(得分:4)

选项-v非常重要。它可以排除grep表达式本身

e.g。

ps -w | grep sshd | grep -v grep | awk '{print $1}' to get sshd id

答案 4 :(得分:3)

这适用于Cygwin,但它在Linux中也应该有效。

ps -W | awk '/ruby/,NF=1' | xargs kill -f

ps -W | awk '$0~z,NF=1' z=ruby | xargs kill -f

Bash Pitfalls

答案 5 :(得分:2)

您可以使用命令killall

$ killall ruby

答案 6 :(得分:0)

非常简单。 简单地运行任何这样的程序: - x = gedit&amp;回声$!这将为您提供此过程的PID。 然后做这个杀-9 $ x

答案 7 :(得分:-1)

要杀死shell中的进程

getprocess=`ps -ef|grep servername`
#echo $getprocess
set $getprocess 
pid=$2
#echo $pid
kill -9 $pid

答案 8 :(得分:-1)

如果您已经知道该过程,那么这将非常有用:

PID=`ps -eaf | grep <process> | grep -v grep | awk '{print $2}'`
if [[ "" !=  "$PID" ]]; then
echo "killing $PID"
kill -9 $PID
fi