【发布时间】:2015-06-19 03:17:41
【问题描述】:
我有一个 shell 脚本,它生成一个 java 进程,我想将它包装在一个包装器中以便与 monit 一起使用。
我试过了
的monit推荐#!/bin/bash
name=`basename $1`
case $2 in
start)
echo $$ > /var/run/service.pid;
exec 2>&1 $1 1>/var/log/$name.stdout
;;
stop)
kill `cat /var/run/service.pid` ;;
*)
echo "usage: <path to app> {start|stop}" ;;
esac
我会在哪里使用它,例如 wrapper.sh /usr/sbin/cmd start
当我这样做时,我看到 2 个进程启动。一个是wrapper中的exec,另一个是我的java进程。
但是,$$ 的 pid 是 /usr/sbin 包装器的 pid,而不是实际 java 进程的 pid。因此,如果我“停止”服务或杀死该 pid,那么 java 进程就会成为孤立的。
另一方面,如果我在前台运行/usr/sbin/cmd 然后杀死它,它确实会杀死子进程。
【问题讨论】:
-
如果你
execjava 进程作为脚本,表示java 进程将替换运行包装器的shell 进程,因此将保持相同的PID。您的问题是 java 进程进一步分叉其他进程。 -
谢谢,这是我需要的钥匙。在执行我的 java 进程的 /sbin 命令中,我还需要在 java 调用之前添加
exec,以便它也可以使用相同的 pid。现在在我的 sbin 包装器中,我有exec java ...并且一切都很好。谢谢!