我的理解是,为守护进程创建 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 上,一切都完全不同:(