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

Я поддерживаю приложение, которое в настоящее время состоит из 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

  • Выполнение чего-то, когда процесс завершается
  • Проверьте, работает ли процесс в привилегированном режиме
  • Как узнать, сколько ядер используется процессом?
  • Рекомендации по отслеживанию работы и процессов и многозадачности
  • Как запустить 3 процесса на одном терминале, а затем выйти из всех 3 легко?
  • Почему нет простого способа перечислить все процессы в данной группе процессов?
  • Можно ли настроить количество подзадач для GNU параллельно после вызова?
  • Есть ли возможность установить родительский процесс при создании нового процесса?
  • Таинственные экземпляры bash с использованием большого количества процессоров, как я могу отлаживать?
  • Что такое «подрезы»?
  • Каковы надлежащие инструменты для настройки удаленной компиляции и работы (что-то вроде ideone)?
  • Interesting Posts

    Пользователи в файловой системе sshfs или альтернативы

    Как я могу просмотреть все записи журнала в Centos 7?

    Как сбросить значение имени файла bash для «больше»?

    Самый быстрый способ разработки несжатого размера большого файла GZIPPED

    Как поместить символ новой строки в файл с помощью команды echo и оператора перенаправления?

    Сортировка однозначно из строки

    Как вы можете зеркально отразить вывод одного терминала на другой?

    Как Debian PTS обнаруживает, что есть новая версия upstream?

    Как удалить префикс из электронной почты в таблице?

    Печать номеров строк файлов, которые я просматриваю через

    Какие службы должны быть остановлены с помощью скриптов preinst против prerm?

    Изнашивание уровня SD-карты из-за файла подкачки во встроенном Linux

    Зачем нужно указывать два изображения init – initrd и boot – внутри KVM для загрузки в bash?

    печатать различное количество строк до и после шаблона

    как отключить USB-устройства на основе идентификатора поставщика в среде Linux?

    Linux и Unix - лучшая ОС в мире.