Ash pidfile显示错误的进程ID

时间:2012-10-03 10:52:47

标签: ruby bash monit openwrt ash

我有一个非常简单的包装器脚本来启动监视网络连接的ruby程序。路由器上的脚本 - 因此我们使用的是灰,而不是bash。

由于我们使用monit来监控状态,我需要一个PID文件。问题是,包装器设置的进程ID比ruby程序少一个。

因此Monit跨越了数百个进程。如何让包装器启动ruby程序并创建正确的pid文件?

我的包装器看起来像这样:

#!/bin/sh /etc/rc.common
  start(){
    echo $$ > /var/run/ping.pid
    ruby /etc/scripts/ping.rb & > /dev/null 2>&1
  }
  stop(){
    kill `cat /var/run/ping.pid`
}

1 个答案:

答案 0 :(得分:2)

我认为你必须这样做:

#!/bin/sh /etc/rc.common
  start(){
    ruby /etc/scripts/ping.rb & > /dev/null 2>&1
    echo $! > /var/run/ping.pid
  }
  stop(){
    kill `cat /var/run/ping.pid`
}

在POSIX shell(如sh)中,$$包含shell的当前进程ID,而$!包含最近生成的异步子进程的进程ID。在这种情况下,$!包含ruby的PID。