Начать процесс, если он мертв - PullRequest
0 голосов
/ 03 апреля 2012

Я пытаюсь запустить процесс, если он не запущен. Вот что я пытаюсь

#!/bin/bash
pid=`ps ax | grep app | grep -v grep | wc -l`
  if [ $pid = 0 ]
then
 /etc/init.d/app start
fi

Проблема в том, что линия

/etc/init.d/app start

не выполняется. Что здесь не так? Я знаю, что могу вам, демон-инструменты, но мне нравится подход "bash".

Ответы [ 4 ]

3 голосов
/ 03 апреля 2012

Посмотрите на оператора ==.

Лучше всего может быть что-то вроде

pid=`ps ax | grep app | grep -v grep`
test -z "$pid" && /etc/init.d/app start
2 голосов
/ 03 апреля 2012

Вы можете избежать двойного поиска, превратив свое ключевое слово в регулярное выражение, которое не соответствует самому себе. И вы можете использовать grep -c вместо подсчета с wc. В вашем скрипте вы можете попробовать:

pcount=`ps ax | grep -c "[a]pp"`

В качестве альтернативы используйте фактический pid вместо счетчика процессов:

#!/bin/bash

pid=`ps ax | awk '/[a]pp/{print $1}'`

if ! ps "$pid" >/dev/null; then
  /etc/init.d/app start
fi

Обратите внимание, что это все еще очень плохой способ обработки перезапусков службы. Вы должны увидеть, поддерживает ли app свой собственный pid-файл, возможно, где-то в / var / run /, а затем протестировать его содержимое.

#!/bin/sh
if [ -f /var/run/app.pid ]; then
  if ps `cat /var/run/app.pid` >/dev/null; then
    /etc/init.d/app start
  fi
else
  /etc/init.d/app start
fi

Или, что еще лучше, запустите приложение , используя daemontools runit или upstart или что-то подобное, что позаботится об этих вещах для вас .

0 голосов
/ 03 апреля 2012

Я не могу проверить свои серверы прямо сейчас, но Debian использует start-stop-daemon для загрузки сервисов, он кажется правильным инструментом для вашей задачи, так как он отслеживает ваш фонобрабатывать по PID, а не просто сопоставлять имя в списке процессов (что тоже можно сделать).

0 голосов
/ 03 апреля 2012

Если у вас есть GNU ps, это просто и не требует никакого сумасшествия.

if ! ps -C app >/dev/null ; then
     /etc/init.d/app start
fi

Вам просто нужно быть осторожным, чтобы app, который вы передаете ps, был действительнымимя процесса.

...