Mac OS: Sierra

Mac に、Homebrewで、PHP, Apache,
Mysqlをインストール後、ブラウザーでhttp://localhostが表示できないので、Apache, MySQL,
Homebrewをアンインストールしました。

そのご、Macの標準のApacheが邪魔をしている可能性があるとかんがえて、

```

    sudo apachectl stop
    
```

を実行したところ、以下のようなエラーがでました。

> /System/Library/LaunchDaemons/org.apache.httpd.plist: Could not find
> specified service

このあとに、

```

    $ sudo apachectl start
    
```

をすると、何もエラーがなくて

```

    $ sudo apachectl stop
    
```

も出来たようです。

```

    $ which Apachectl
    /usr/sbin/apachectl
    
```

質問内容:

1) Apacheをstopした時のエラーの原因と対処方法を知りたいです。  
2) Mac標準のApacheが自動起動しないようにする方法(以下のコードがそれです)  
sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist

をした時も上のエラーが起きたので、  
その原因と対処の仕方について教えて欲しいです。

初心者なので、具体的に何をどうれば良いのかご教授していただく非常に助かります。  
(対処をして行く中で色々覚えてきていますが、まだ、混乱しているところもありますので・・・)

この目的は、HomebrewであたらにApacheをインストールした時に、Mac標準のApacheが実行されないようにすることです。
CC BY-SA 3.0
2017-05-21T21:59:13.170
34907
2017-07-21T18:02:34.267
2017-07-21T18:02:34.267
754
23249
question
macos apache
Apache, MySQL, Homebrewをアンインストール後、Mac標準のApacheをStopするとエラーが発生
> Apacheをstopした時のエラーの原因と対処方法を知りたいです。

これは、Mac標準のApacheがもともと起動していなかったためと考えられます。手元のmacOS Sierraで実験した結果が根拠になりますが..

```

    # Apacheを起動
    $ sudo apachectl start
    
    # Apacheが起動済みなことを確認
    $ sudo launchctl list | grep httpd
    5329    0   org.apache.httpd
    
    # 停止
    $ sudo apachectl stop
    
    # 停止したことを確認
    $ sudo launchctl list | grep httpd
    
    # 再度停止しようとしてみる
    $ sudo apachectl stop
    /System/Library/LaunchDaemons/org.apache.httpd.plist: Could not find specified service
    
```

対処としては、「何もしない」でokだと思います。

> sudo launchctl unload -w
> /System/Library/LaunchDaemons/org.apache.httpd.plist  
>  をした時も上のエラーが起きた

これは `sudo apachectl stop` と同じ原因と対処になります。というのも、 `apachectl` コマンドは裏で `launchctl`
を上と同じ引数で呼んでいるためです。

```

    # apachectl の実体はどこにあるのかを調べる
    $ which apachectl
    /usr/sbin/apachectl
    
    # apachectl が実際何をしているのか調べる
    $ less apachectl
    # ctrl-v, option-v, ctrl-n, ctrl-p などでスクロールしながらスクリプトを読む
    
```

関係があるのはこの箇所:

```

    stop|graceful-stop)
        run_launchctl unload -w $LAUNCHD_JOB
        ERROR=$?
        ;;
    
```

`stop` の場合は `run_launchctl` という関数を `unload -w $LAUNCHD_JOB` という引数で呼んでいます。
`run_launchctl` は上の方で定義されていて、

```

    run_launchctl() {
        if [ $UID != 0 ]; then
            echo This operation requires root.
            exit 1
        fi
    
        $LAUNCHCTL $@
    }
    
```

root 権限で実行されているかをチェックした後、 `LAUNCHCTL` 変数で指定されているコマンドに引数をすべて渡しています。 `LAUNCHCTL`
と `LAUNCHD_JOB` はさらに上で定義されており、

```

    LAUNCHCTL="/bin/launchctl"
    LAUNCHD_JOB="/System/Library/LaunchDaemons/org.apache.httpd.plist"
    
```

ここまでを合わせると、最終的には `sudo apachectl stop` をすると以下のコマンドが実行されることになります。

```

    /bin/launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist
    
```
CC BY-SA 3.0
2017-07-03T06:27:57.300
36061
2017-07-03T06:27:57.300
30
34907
answer