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
.它没有给这个过程一个干净的机会:
- 关闭套接字连接
- 清理临时文件
- 告诉它的孩子它会消失
- 重置其终端特性
依此类推等等.
一般情况下,发送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,这就是我过去常常做的事情,但是当我了解[]变体时,我认为最好在管道中产生少一个进程.
作为一个开始,没有必要做一个ps -aux | grep...
命令pidof
是更好的使用.而几乎从此再也kill -9
看这里
要从bash中获取命令的输出,请使用类似的内容
pid=$(pidof ruby)
Run Code Online (Sandbox Code Playgroud)
或pkill
直接使用.
归档时间: |
|
查看次数: |
117955 次 |
最近记录: |