如何找到用startproc启动的进程的PID?

如何找到用startproc启动的进程的PID?

我的理解是,为守护进程创建 PID 文件通常是一个好主意,这startproc是启动这些守护进程的好方法。

我知道它startproc需要 -i 和 -p 参数来引用 PID 文件,但它不会创建 PID 文件或使用它启动的守护进程的 ID 来更新它。使用回显$!时也不会给出正确的进程标识符。startproc

startproc有人对如何获取守护进程的 PID 有什么建议吗?


无论如何,我正在编写一个 rc 脚本,并希望以非特权用户身份启动 JVM。我真的不想给这个用户一个登录外壳(所以su -c "java ..." user不是一个选项),并且我真的不想在守护进程运行时挂起一个根进程(这排除了sudo -Eu user java ...)。因此,虽然我承认这些都是可能的解决方法,但我认为它们都不是理想的。不过,如果我对这些替代方案的假设是错误的,请随时纠正我。

答案1

看来没有人知道这样做的方法。

相反,我只是做了 Tomcat 基本上所做的事情;编写一个 shell 脚本并从我的服务中调用它,而不是java直接调用。

该 shell 脚本还负责echo $!在启动 JVM 后创建 PID 文件。对于关闭,我编写了一个类似的脚本来检查此 PID 文件并在成功关闭后将其删除。这两个脚本都是sudo -Eu $USER script_name.sh从服务调用的。

从技术上讲,这并不能回答我的问题,因为该解决方案startproc根本不使用,但它可以工作并避免比较正在运行的进程的命令行的繁琐任务。

答案2

遇到了同样的问题,尝试了一些方法:

PID=$(startproc -p $PID_FILE <some parameters>)
echo $PID  > $PID_FILE

它起作用了......在 SLES 11 SP4 上尝试过

但在 SLES 12 上,一切都完全不同:(

相关内容