6

Я новичок в Apache и проблемы отладки, вызванные этим. Я понял, что когда Apache запускается, он записывает свой собственный идентификатор процесса в httpd.pid в удобочитаемом формате, как описано здесь.

Я не совсем понимаю, зачем нужен идентификатор процесса. Даже если это необходимо, я не понимаю причину такого подхода.

В Linux процесс может найти идентификатор процесса Apache, используя ps -ef и т.д. В общем, я не слышал ни о каком другом процессе, записывающем свой идентификатор процесса в некоторый файл.

Что такого особенного в этом процессе Apache?

4 ответа4

9

В большинстве систем Unix службы запускаются и останавливаются системой init . Многие дистрибутивы Linux используют устаревший sysvinit, в котором почти полностью отсутствуют функции управления сервисами, поэтому скрипты в /etc/init.d или /etc/rc.d выполняют фактическую работу по запуску или уничтожению Apache. Эти начальные индексы написаны простым текстом и не имеют других средств отслеживания запускаемых ими процессов - кроме чтения его PID из предустановленного местоположения. (Initscript может знать PIDS только о процессах, которые он запускал напрямую, но не о дочерних процессах этих процессов, а также о процессах, запущенных в последний раз, когда был вызван тот же сценарий. Это означает, что initscript не может отслеживать процессы, которые были запрограммированы для того, чтобы "демонизировать" себя.)

(Да, процесс можно найти с помощью ps -ef или непосредственно с помощью /proc . Тем не менее, это несколько ненадежный метод - может быть одновременно запущено несколько процессов Apache: например, mpm-prefork или несколько независимых конфигураций Apache. Из-за этого почти каждый демон в Linux создаст "pidfile" в /run или /var/run , чтобы его можно было легко остановить с помощью initscript. Скорее всего, у вас будут crond.pid , ntpd.pid , rsyslogd.pid , sshd.pid и т.д.)

Только очень недавние системы инициализации Linux беспокоят процессы отслеживания: Upstart в Ubuntu нужно точно указать, сколько ожидаемых форков, в то время как systemd в Fedora использует cgroups ядра для отслеживания процессов, принадлежащих сервису.

2

Причина в том, что третьи стороны могут использовать сигналы с помощью kill(1) для управления запущенным экземпляром Apache. Например, чтобы настроить его на корректную перезагрузку конфигурации.

Другие ответы все еще применяются.

Также имейте в виду, что вы можете запускать несколько экземпляров Apache на разных портах и с разными конфигурациями на одном компьютере. Это становится еще интереснее, когда вы используете режим разветвления (по умолчанию, IIRC). Вы должны быть в состоянии определить управляющий экземпляр Apache для некоторой орды дочерних процессов, так что это самый прагматичный способ сделать это.

1

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

Это более важно с apache и моделью процесса, потому что (как правило) apache имеет отношения родитель / потомок, причем родительский элемент является контроллером, который разветвляет / собирает потомков. Если вы хотите отключить сервер, вам нужно отправить сигнал родителю, а не детям. Если вы только что сделали ps вам нужно было бы пройтись через это отношение родитель / ребенок, чтобы найти родителя; только тогда вы можете послать ему сигнал.

1

Apache хочет знать, запущен ли другой экземпляр Apache. Запись номера процесса более надежна, чем использование ps и позволяет проверить, не произошло ли неожиданное завершение процесса (без удаления файла .pid ). Также нет гарантии, что ps будет доступен в любой конкретной системе (например, из-за разрешений).

Ряд других программ также используют файлы .pid . Проверьте каталог /var/run . У меня их несколько.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .