我想编写一个shell脚本(.sh
文件)来获取给定的进程ID。我在这里尝试的是,一旦我获得进程ID,我想杀死该进程。我在Ubuntu(Linux)上运行。
我能够通过像
这样的命令来做到这一点ps -aux|grep ruby
kill -9 <pid>
但我不确定如何通过shell脚本来实现。
答案 0 :(得分:36)
在grep
的结果中使用ps
在脚本中是一个坏主意,因为在某些时候它也会与您刚刚调用的grep进程匹配。命令pgrep
可以避免此问题,因此如果您需要知道进程ID,那么这是一个更好的选择。 (注意,当然,可能有许多进程匹配。)
但是,在您的示例中,您可以使用类似的命令pkill
来终止所有匹配的进程:
pkill ruby
顺便提一下,你应该知道在几乎每种情况下使用-9
都是过度的(ho ho) - 在“{无效使用kill -9
表格信件”的文本中有一些有用的建议:
不不不。请勿使用
kill -9
。它不会让这个过程有机会干净利落:
- 关闭套接字连接
- 清理临时文件
- 告知其子女它会消失
- 重置其终端特征
醇>依此类推等等。
一般情况下,发送15,然后等待一两秒,如果不是这样 工作,发送2,如果不起作用,发送1.如果没有, 删除二进制文件是因为该程序表现不佳!
请勿使用
kill -9
。不要带出联合收割机只是为了整洁 花盆。
答案 1 :(得分:18)
如果您要使用ps
和grep
,那么您应该这样做:
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 -9
看here
从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
答案 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