Файл pid httpd содержит только один идентификатор, хотя он породил множество

Я хочу, чтобы в системе CentOS работало несколько служб httpd, чтобы, если я разрабатываю сценарий mod_perl и мне нужно перезапустить одну из них, другие могли работать независимо. У меня была эта настройка в Windows, и я мигрирую.

Естественно, это означает отдельные файлы PID. Я настраиваю свой с помощью директивы PidFile в httpd.conf и указываю скрипт init.d на то же место. Он создает файл в порядке, но не заполняет его всеми PID:

$ sudo killall httpd ; sudo service httpd-dev restart
Stopping httpd: cat: /var/run/httpd/httpd-dev.pid: No such file or directory
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]

Starting httpd:                                            [  OK  ]
$ sudo cat /var/run/httpd/httpd-dev.pid
18279
$ ps -A | grep httpd
18279 ?        00:00:00 httpd
18282 ?        00:00:00 httpd
18283 ?        00:00:00 httpd
18284 ?        00:00:00 httpd
18285 ?        00:00:00 httpd
18286 ?        00:00:00 httpd
18287 ?        00:00:00 httpd
18288 ?        00:00:00 httpd
18289 ?        00:00:00 httpd

...почему это может быть? Затрудняет уничтожение только моих процессов dev httpd позже, когда появятся другие httpd. Нельзя вечно использовать killall...

$ httpd -v
Server version: Apache/2.2.24 (Unix)

Я должен отметить, что минимальная версия CentOS 6.4 не поставлялась с установленным killproc, поэтому я изменил свой init.d, чтобы использовать

kill -9 `cat ${pidfile}`

вместо. Я предполагаю, что killproc будет искать дочерние PID? Итак, мне нужно установить python, чтобы установить killproc, чтобы использовать сценарии инициализации для httpd?


person Kev    schedule 01.10.2013    source источник


Ответы (1)


Здесь есть две вещи:

  • Ваш единственный экземпляр Apache может иметь несколько связанных с ним PID, в зависимости от выбранного типа MPM. Однако это не должно повлиять на вас, так как вам нужно только убить PID, записанный в файл PID, и этот процесс уничтожит все остальные экземпляры Apache.

  • Если вы попытаетесь запустить несколько экземпляров Apache одновременно, вам придется указать разные файлы PID, по одному для каждого. Затем вы можете решить, какие экземпляры вы хотите убить - вам нужно обработать PID-файл каждого выбранного экземпляра. Предоставление одного и того же файла PID нескольким экземплярам и ожидание, что каждый из них поместит свой собственный PID в один и тот же файл, это не сработает.

person Laszlo Valko    schedule 01.10.2013
comment
Re: 1, я не думаю, что это правда, потому что я сделал sudo kill -9 18279, а затем ps -A | grep httpd все равно показывает все остальные. Я использую неправильный MPM? re: 2, я не совсем конкретизировал это в своем вопросе, но это то, что я имел в виду под естественным... битом; вот почему он называется httpd-dev.pid, а другие будут иметь другие имена (как только я получу возможность перезапустить этот....) - person Kev; 01.10.2013
comment
Ну, может быть, это потому, что kill -9 не является правильным способом остановить Apache ... Для настоящих многопоточных MPM даже kill -9 должен работать правильно. Для разветвленных MPM существует высокая вероятность того, что разветвленные дочерние элементы не сразу (или когда-либо) заметят смерть своего родителя, и ясно, что родитель не может посылать сигналы выхода своим дочерним элементам. Насколько мне известно, в Apache нет возможности получать PID дочерних элементов для разветвления MPM. Кроме того, если вы запускаете какой-либо CGI или что-либо, разветвленное из Apache (например, PHP-скрипт, запускающий внешние программы), Apache вообще не управляет этими процессами. - person Laszlo Valko; 01.10.2013
comment
Ах! Бьюсь об заклад, я взял эту конфигурацию, потому что разветвление - единственное, что вы можете использовать на win32. Попробую переключиться на настоящую многопоточность. Спасибо! - person Kev; 01.10.2013
comment
О, подождите, MPM скомпилированы. Мой был с «prefork» на CentOS здесь. Но это значение по умолчанию для unix... так что... я немного запутался. kill -9 не подходит, но я уверен, что необъявленная зависимость killproc, которая зависит от python, также не подходит? так что вы обычно не можете перезапустить httpd по умолчанию? зачем тогда скрипт init.d? - person Kev; 02.10.2013
comment
Вы используете kill -TERM для PID в файле PID, и он должен завершиться. На самом деле, apachectl -k stop должен делать что-то подобное. - person Laszlo Valko; 02.10.2013
comment
Ага, это билет. Спасибо! - person Kev; 02.10.2013