【问题标题】:Monitor shell script with monit使用 monit 监控 shell 脚本
【发布时间】: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 ... 并且一切都很好。谢谢!

标签: java bash shell monit


【解决方案1】:

在运行命令之前不能获取 pid,但可以使用 $!。另外,我建议您使用nohup。所以像

nohup $1 > /var/log/$name.stdout 2>&1 &
echo $! > /var/run/service.pid

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2010-11-16
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    相关资源
    最近更新 更多