PID-файл Ash показывает неправильный идентификатор процесса

У меня есть очень простой сценарий-оболочка для запуска программы Ruby, которая отслеживает сетевое соединение. Сценарий находится на маршрутизаторе - следовательно, мы используем ash, а не bash.

Поскольку мы используем monit для отслеживания статуса, мне нужен файл PID. Проблема в том, что идентификатор процесса, установленный оболочкой, на единицу меньше, чем у программы 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`
}

person simonmorley    schedule 03.10.2012    source источник


Ответы (1)


Думаю, вам придется сделать:

#!/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 (например, sh) $$ содержит идентификатор текущего процесса оболочки, а $! содержит идентификатор процесса последнего порожденного асинхронного подпроцесса. В этом случае $! содержит PID рубина.

person Janito Vaqueiro Ferreira Filho    schedule 03.10.2012
comment
Если бы я мог обнять тебя, я бы! Спасибо - person simonmorley; 03.10.2012