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
解决方法
我将回答我自己的问题,因为我发现了一些我正在寻找的东西:一般的解决方案,避免与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实现.
我想我会试一试,看看它是怎么回事.