linux – 标记/识别进程以杀死它们的最佳方法?

前端之家收集整理的这篇文章主要介绍了linux – 标记/识别进程以杀死它们的最佳方法?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的 linux启动脚本中,当我启动一个类似的过程(openvpn用于这个例子,但问题对于任何过程都是一般的);
openvpn --config /etc/myserver.conf

找到它的最佳方法是什么,并且100%确定它是正确的过程并在停止部分杀死它?我通常使用的东西:

pid=$(ps -efww | grep -v grep | grep openvpn | grep /etc/myserver.conf | awk '{print $2}')

当然它几乎在所有时间都有效,但有时会出现意外匹配具有几乎相同名称的进程的问题(例如myserver.conf-new),所以我正在寻找更好的方法.

>某些进程有一种方法可以将pid存储在某个地方,这很好,但通常我只是基于位于文件中的pid来杀死进程.
> Solaris有projects,在我有限的经验中并不是所有的玫瑰花,因为你必须先设置/ etc / projects,但它确实可以很容易地标记并稍后查找进程.
>也许使用环境,比如设置一个像(MYID = myserver)这样的环境变量然后用ps e -ef查找它grep MYID = myserver?意外匹配仍然可能遇到同样的问题.

我希望有一些简单的事情:

launch --tag myserver openvpn --config /etc/myserver.conf

pgrep --tag myserver

解决方法

感谢@ Iain,@ KyleSmith和@ M_1的答案,并帮助我开始使用Server Fault.如果我在这里有更多的代表我会给你们1个人. (编辑:现在我有代表,1s左右).

我将回答我自己的问题,因为我发现了一些我正在寻找的东西:一般的解决方案,避免与ps不精确的模式匹配,并且不使用pid文件.这是完全主观的,这将是“最好”的方式,因为在使用pid文件的unix中显然有一个漫长而成功的历史,但是这是我明确表示我不喜欢的原因有各种各样的原因,它们是:它们可以是制作得恰到好处,每个软件都有所不同,每个发行版都有不同的做法,可能会被陈旧/覆盖,而且本身并不代表实际发生的事情.我宁愿使用某种过程标记,询问内核并获得真正的答案.

修剪下来的例子:

#!/bin/sh
_TAG=d726cc7fa57a308afdc057b228a13f6d
case "$1" in
start)
  _TAG=$_TAG ./self-backgrounding-process
  _TAG=$_TAG ./non-self-backgrounding-process &
  ;;
stop)
  pids=$(grep -l "\b_TAG=$_TAG\b" /proc/*/environ | cut -d/ -f3)
  [ -n "$pids" ] && kill $pids
  ;;
esac

关键点是:

>为标签使用md5sum(非常不可能意外匹配的东西)
>在每个服务的启动脚本中使用不同的标记
>查询/ proc / * / environ获取运行/相关/标记进程的准确列表
>使用grep with \b匹配字边界以确保完全匹配

我不确定我是否喜欢污染环境,但我不知道有任何其他方式(例如Solaris项目)以任意方式标记linux进程,以后我可以请求内核.至少,/ proc /< pid> / environ出现在reflect the environment at startup,and not be affected by any changes the process might make after,这表明这应该是可靠的,但是,这可能会出乎意料地改变.这可能在Linux之外也可能不起作用,具体取决于操作系统的/ proc和grep实现.

我想我会试一试,看看它是怎么回事.

猜你在找的Linux相关文章