macOS MojaveでApacheを起動しようとしたらPermission denied: AH00099: could not create /usr/local/var/run/httpd/httpd.pidとなったときの対応方法


事象 : Apacheを起動しようとしたら起動しなくてログを見たらなんか出てた

# 起動した?
$ apachectl start
# 起動していない
$ apachectl stop
httpd (pid 16705?) not running
# 設定間違い?
$ httpd -t
Syntax OK
# logファイルどこだっけ?
$ cat /usr/local/etc/httpd/httpd.conf | grep ErrorLog
# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
ErrorLog "/usr/local/var/log/httpd/error_log"

$ cat /usr/local/var/log/httpd/error_log
[Wed Dec 19 23:53:59.892903 2018] [core:warn] [pid 73462] AH00098: pid file /usr/local/var/run/httpd/httpd.pid overwritten -- Unclean shutdown of previous Apache run?
[Wed Dec 19 23:53:59.893658 2018] [core:error] [pid 73462] (13)Permission denied: AH00099: could not create /usr/local/var/run/httpd/httpd.pid
[Wed Dec 19 23:53:59.893697 2018] [core:error] [pid 73462] AH00100: httpd: could not log pid to file /usr/local/var/run/httpd/httpd.pid

原因 : 前回起動時の httpd.pidが残っているが上書きする権限がないから

httpd.pidってなんだろう?

PIDは、waitpid()やkill()、あるいはsigsend()といったシステムコールの引数であり、ある特定のプロセスに対して何らかの処理を要求する場合、そのプロセスの特定のために使われる。
但し、あるプロセスから特定の他のプロセスのPIDを得る方法はなく、このためプロセスは、必要に応じてプロセスIDを書いたファイルを用意する。例えば、syslogdなら「/var/run/syslogd.pid」、httpdなら「/var/run/httpd.pid」、といった具合である。なお、このパス名は環境依存であり、OSによっては異なる場所に置かれる場合がある。
プロセスID ‐ 通信用語の基礎知識

$ ls -l /usr/local/var/run/httpd
total 8
-rw-r--r--  1 root  admin  6 12 10 23:53 httpd.pid

対応 : httpd.pid を削除する

今回は削除します。様子を見てよく発生するようであれば httpd.pid のあるディレクトリの権限変更を検討します。

$ sudo rm /usr/local/var/run/httpd/httpd.pid 
Password:
$ ls -l /usr/local/var/run/httpd
$ apachectl start
$ apachectl stop
$ cat /usr/local/var/log/httpd/error_log | grep Dec\ 20
[Thu Dec 20 21:11:09.377340 2018] [mpm_prefork:notice] [pid 74369] AH00163: Apache/2.4.37 (Unix) configured -- resuming normal operations
[Thu Dec 20 21:11:09.377765 2018] [core:notice] [pid 74369] AH00094: Command line: '/usr/local/opt/httpd/bin/httpd'
[Thu Dec 20 21:11:26.251257 2018] [mpm_prefork:notice] [pid 74369] AH00169: caught SIGTERM, shutting down

error_log に上記のような出力があっても単なる情報だから気にしなくてらしい。