2015-06-19 2 views
0

У меня есть сценарий оболочки, который порождает Java-процесс, который я хотел бы обернуть в оболочку для использования с monit.Сценарий оболочки монитора с 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 procesess раскручивается. Один из них - это exec в оболочке, а другой - мой java-процесс.

Однако pid $$ - это оболочка/usr/sbin, а не фактический процесс java. Поэтому, если я «остановил» службу или убью этот pid, тогда процесс java становится сиротой.

С другой стороны, если я запускаю /usr/sbin/cmd на переднем плане, а затем убиваю его, он убивает дочерний процесс.

+1

Если вы 'exec' процесс Java как сценарий aove Dows, указанный процесс Java заменит процесс оболочки работает обертку и, таким образом, будет держать тот же PID. Ваша проблема в том, что java-процесс дополнительно расширяет другие процессы. – lcd047

+0

Спасибо, это был ключ, который мне нужен. В команде/sbin, которая запускает мой Java-процесс, мне также нужно добавить 'exec' перед вызовом java, чтобы он также использовал один и тот же pid. Теперь в моей sbin-оболочке у меня есть 'exec java ...', и все это отлично работает. Благодаря! – devshorts

ответ

2

Вы не можете захватить pid перед запуском команды, но вы можете использовать $!. Кроме того, я предлагаю вам использовать nohup. Так что-то вроде

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

 Смежные вопросы

  • Нет связанных вопросов^_^