Хост-процесс для нескольких процессов?

Я поддерживаю приложение, которое в настоящее время состоит из 4 процессов, которые зависят друг от друга различными способами. В настоящий момент эти процессы запускаются, останавливаются и контролируются через довольно «выращенный» сценарий bash, который содержит такие жемчужины:

# And another rather dirty way to identify the node Api # process by knowing the filename that is given to node.js. # Keep in mind not to kill the retrieved process directly, but # check the running user and the used port to make sure you # actually got the correct process. findApiProcessId() { local pid=`ps ax | grep node | grep api/server\.js | cut -c -5` if [ $pid ] then echo $pid else echo -1 fi } 

Другие процессы проверяются с использованием аналогичных средств.

Теперь мне разрешено полностью переделывать это управление процессами, но, честно говоря, я не знаю, с чего начать. Процессы, которые необходимо контролировать, – это

  • lighttpd, который управляет «стабильным» pid-файлом
  • mongod, который управляет файлом pid, который, похоже, не является достаточно надежным. Иногда это указывает на pid, который принадлежит совершенно другому процессу.
  • По крайней мере, два экземпляра node.js (работает с nohup), которые пытаются сохранить некоторый файл pid, но терпят неудачу довольно жалко.

Мне нужно иметь возможность запускать и останавливать отдельные процессы и запрашивать их статус, все из командной строки. И мне нужно иметь возможность запускать эту программу несколько раз в разных каталогах для разных «групп» нашего приложения. В настоящее время дочерние процессы проверяют текущий рабочий каталог для файлов конфигурации и могут «выбирать» свои порты, не блокируя другие запущенные экземпляры.

Моя первая мысль заключалась в том, чтобы написать простой хост процесса с использованием Python или C, но я думаю, что это своего рода перебор. Поэтому я искал существующий инструмент, но поиск « инструментального средства хоста Linux » не показывает ничего полезного.

Так есть ли какие-либо «стандартные» хост-инструменты процесса, которые могут наблюдать за несколькими дочерними процессами?

2 Solutions collect form web for “Хост-процесс для нескольких процессов?”

Как насчет runit , «схема инициализации UNIX с надзором за обслуживанием» ?

Я думаю, это соответствует вашим требованиям, т.е.

  • «Управление службой runit разрешает зависимости для демонов службы, которые автоматически запускаются процессом супервизора». ( больше )
  • проверка работы службы может быть выполнена через sv status service
  • существует уже множество определений сервисов , их легко использовать и хороший ресурс для создания собственных
  • он упакован для различных дистрибутивов и достаточно хорошо установлен ( есть страница wiki lighttpd на runit , см. также эти сценарии запуска, включая lighttpd и mongodb )
  • он может вмещать множество различных вариантов демона (т.е. node.js вообще не создает проблемы )

Я не могу ответить на вопрос «одна услуга в некоторых вариантах» умным способом, вы могли бы, конечно, определить услуги отдельно … (возможно, для этого может быть какое-то опрятное решение symlink-and-study-my-pwd) я не уверен, что если пытаться быть умным, это хорошая идея, думая о ремонтопригодности)

Редактировать Эта страница ArchWiki предоставляет быстрый обзор, который может быть лучше, чем runit .

pidof и pgrep помогут, если вы хотите pidof это (и отказаться от сомнительной ps | lots | of | things idiom). Вы также можете фильтровать uid, gid, ppid, самые старые, новейшие и т. Д.

Команда kill -0 $pid может использоваться для подтверждения того, что существует определенный идентификатор процесса.

Могут возникнуть осложнения, если у вас есть несколько экземпляров в разных каталогах, которые вы не можете отличить между ними через ps . В зависимости от платформы вы можете легко их отличить с помощью cwd, например, на linux check /proc/$PID/cwd .

 # pgrep httpd 9483 9492 9493 9497 # head -1 /usr/local/apache2/logs/httpd.pid 9483 # kill -0 `head -1 /usr/local/apache2/logs/httpd.pid` && echo $? 0 # ls -l /proc/9483/cwd /proc/9483/exe lrwxrwxrwx 1 root root 0 2013-01-30 19:40 /proc/9483/cwd -> / lrwxrwxrwx 1 root root 0 2013-01-30 19:37 /proc/9483/exe -> /usr/local/apache2/bin/httpd 

(извините, $ CWD от Apache не слишком интересен …)

Ваш netstat также может помочь:

 # netstat -plnt | grep :80 tcp 0 0 192.168.123.123:80 0.0.0.0:* LISTEN 9483/httpd 

Обычно используемый трюк в сценариях запуска, используемых для мониторинга процессов, которые не очень хороши в управлении файлом PID, заключается в том, чтобы запускать их не-демонамизирующим / не-forking образом в качестве фонового задания с помощью & (хотя, очевидно, программа должна иметь флаг флагов, иногда называемый режимом inetd ) и писать $! в файл PID.

pstree – полезный инструмент для отслеживания иерархии процессов:

 # pstree -lnp 9483 httpd(9483)-+-rotatelogs(9484) |-rotatelogs(9485) |-rotatelogs(9486) |-rotatelogs(9491) |-httpd(9492) |-httpd(9493)-+-{httpd}(9495) | |-{httpd}(9496) | |-{httpd}(9498) | |-{httpd}(9499) | |-{httpd}(9502) | |-{httpd}(9504) [... lots more threads snipped ...] 

В крайнем случае lsof – это многоплатформенный инструмент для отслеживания lsof файлов, соединений или PID.

Для стандартной системы типа диспетчера процессов проверьте комплект daemontools DJB. Его сайт http://cr.yp.to/daemontools.html , хотя, откровенно говоря, документация может быть немного тупой, есть много учебников, таких как доступные страницы.

Ниже перечислены альтернативы (не используемые мной), перечисленные здесь: https://serverfault.com/questions/192302/alternative-to-daemontools-djbtools-to-supervise-unix-processes

  • Что указывает этот STAT-процесс?
  • Как проверить, существует ли процесс в скрипте python?
  • Есть ли возможность установить родительский процесс при создании нового процесса?
  • Как запустить 3 процесса на одном терминале, а затем выйти из всех 3 легко?
  • Команда, с которой был запущен процесс
  • Почему нет простого способа перечислить все процессы в данной группе процессов?
  • Найти создателя задачи
  • Как захватить командный процесс
  • Каковы надлежащие инструменты для настройки удаленной компиляции и работы (что-то вроде ideone)?
  • Проверьте, работает ли процесс в привилегированном режиме
  • Что такое «подрезы»?
  • Linux и Unix - лучшая ОС в мире.