У меня apache работает нормально при запуске и вручную с помощью /etc/init.d/apache2 start
и меня это устраивает, но один из менеджеров серверов привык использовать служебную команду, и по какой-то причине apache не может правильно работать через службу.
Если запустить его напрямую, я получу:
Start
...[OK]
Stop
...[OK]
Help
Usage: /etc/apache2/bin/httpd [-D name] [-d directory] [-f file]
...
но когда я пытаюсь запустить его через служебную команду, я получаю:
Start
start: Job failed to start
Stop
stop: Unknown instance:
Help
Usage: /etc/apache2/bin/httpd [-D name] [-d directory] [-f file]
...
Раньше я думал, что они указывают на разные исполняемые файлы, но, судя по результатам использования справки, они оба указывают на /etc/apache2/bin/apachectl
, что, в свою очередь, указывает на /etc/apache2/bin/httpd
. Также этот указывает мне, что служба не может найти запущенный процесс httpd (возможно, потому, что он называется httpd вместо apache2).
Почему эти два метода, которые вызывают один и тот же исполняемый файл (на самом деле это сценарий, но это не имеет значения), дают разные результаты?
После некоторого исследования и возни с файлами я понял проблему.
Проблема для меня заключалась в обратной совместимости Upstart с sysvinit, что приводило к прозрачному конфликту между двумя файлами. Upstart поддерживает скрипты в /etc/init.d
каталог с поддержкой обратной совместимости для sysvinit, поскольку это старый каталог, который sysvinit использовал для сценариев. Однако Upstart использует /etc/init/
для скриптов. Предполагаемое использование - иметь сценарий в том или ином каталоге. Моя проблема заключалась в том, что у меня были оба (я все еще не уверен, как /etc/init/
скрипт попал туда). Поскольку сценарий в /etc/init
не был функциональным сценарием (он указывал на неправильный apache exe), он не удался при загрузке, что было нормально, так как тот, который был запущен в init.d. Но как только я попытался запустить его через сервис, ошибка стала видна.
я удалил /etc/init/apache2.conf
и теперь сервис apache2 правильно указывает на скрипт в init.d, как я хочу.