MAMPを起動した時のエラーの対処（port 8888 is in use by some other software)

# はじめに
MAMPを起動する際、
<h4><font color=tomato> Apache couldn't be started because port 8888 is in use by some other software.</font></h4>

と表示され起動できなくなってしまったので、その対処法をメモとして残します。


# 条件
<b>PHP</b> version: 7.4.12
<b>macOS Big Sur</b> version: 11.2.3

# もくじ
1. エラー内容
2. 対処 ~ 解決
3. それぞれのコマンドについて
4. おわり

#1. エラー内容

冒頭でも記述しましたが、エラー内容は以下の文となります。

<b> `Apache couldn't be started because port 8888 is in use by some other software.`</b>

日本語にすると、
`"ポート8888が他のソフトウェアで使用されているため、Apacheを起動できませんでした。"`

...ということです。

ポート8888を他のソフトウェアが使ってるみたいです。

#2. 対処
誰がポート8888を使っているのかを確認するために、ターミナルで以下のコマンドを打ち、確認します。

```terminal:手順①
% sudo lsof -i -P | grep "LISTEN"
```
このコマンドを実行した後、パスワードの入力を求められるので<b>`PCを開いた時に入力するパスワード`</b>を入力します(入力内容は見えませんが、ちゃんと入力されています）。

```terminal:手順②
Password:
```

パスワードが通ると、現在実行されているポートの状態が一覧で出力されます。
その中で、8888番を探す！

```terminal:手順③
httpd     76916     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:8888 (LISTEN)
httpd     76917     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:8888 (LISTEN)
httpd     76918     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:8888 (LISTEN)
httpd     76920     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:8888 (LISTEN)
httpd     76922     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:8888 (LISTEN)
```
ありました。
今回では、この５つの実行中のプロセスを停止していきます。
プロセスの停止には、以下のコマンドを打ちます。

```terminal:手順④
% kill -9 *****
```
＊＊＊＊＊には左から２番目の番号(プロセスID)を入力します。

```terminal:記入例
% kill -9 76916
```
これを実行すると、入力した番号のプロセスが終了します。

この調子で他のプロセスIDもkillを実行していく。
最後にもう一度`手順①`のコマンドを実行してちゃんと8888のプロセスが終了しているか確認する。

MAMPが起動できたらOK！

<br>

#3. コマンドとそれぞれのオプションについて

今回のエラーは上で記述した手順で解決したのですが、ターミナルで入力したコマンドのそれぞれの意味が理解しきれていなので、ここからはそのまとめについて記述します。


```terminal
% sudo lsof -i -P | grep "LISTEN"
```

|コマンド|意味|
|---|---|
|sudo|他のユーザーの権限で操作が可能|
|lsof|「<b>L</b>i<b>s</b>t <b>O</b>pen <b>F</b>iles」 = プロセスが開いているファイルを表示する|
|grep |ファイル中の文字列に対して正規表現を使って検索し表示する|

以下は、<b>lsofコマンドのオプション</b>となります。
（他にも複数ありますが、今回は使用したオプションのみ記述しています）

|オプション|意味|
|---|---|
|-i|ローカルホストの待機ポートとプロセスを一覧表示|
|-P|ポート番号(今回では8888)をサービス名に変換しない※1|

<b> | </b> : "かつ"という意味
<b>LISTEN</b> : 現在使用されているIPアドレス・ポート

つまり、このコードは
`「現在使用されている(LISTEN状態)のポートを表示してください」`
という意味になります。
<br>

<b> ※1 </b>
-Pオプションをつけなければ、以下のようにポート番号8888がサービス名となりどれが何なのかが分かりにくくなります。
以下は、-Pオプションを記述しなかった場合の出力結果です。

```terminal:-Pなし
httpd     76916     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:ddi-tcp-1 (LISTEN)
httpd     76917     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:ddi-tcp-1 (LISTEN)
httpd     76918     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:ddi-tcp-1 (LISTEN)
httpd     76920     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:ddi-tcp-1 (LISTEN)
httpd     76922     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:ddi-tcp-1 (LISTEN)
```
上記の出力結果で<font color=tomato>赤枠</font>の部分がサービス名となります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1379469/0c4effa0-27c8-bef4-4eac-e18d3169055b.png" width=80%>
これがポート番号8888のサービス名なのですが、パッと見全然分かりません。

次は-Pオプションありで出力してみます。
上記の出力結果と違い、サービス名が"8888"に変わっていることがわかります。


```terminal:-Pあり
httpd     76916     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:8888 (LISTEN)
httpd     76917     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:8888 (LISTEN)
httpd     76918     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:8888 (LISTEN)
httpd     76920     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:8888 (LISTEN)
httpd     76922     username    4u  IPv6 0xc477c18c7b61912d      0t0    TCP *:8888 (LISTEN)
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1379469/e131c525-83f4-001e-e154-4d7621c4d02a.png" width=80%>


最後に、プロセスを終了するときに使用したコマンドについて。

```terminal
% kill -9
```
|コマンド|意味|
|---|---|
|kill|実行しているプロセスの終了|

killに続く <b> -9 </b> というのは、シグナルIDと言いkillコマンドのオプションとして併用して記述されることもある。

```terminal
% kill -[シグナル名またはシグナルID] プロセスID
```
ちなみに、９は以下のような意味になる。

|シグナル名|シグナルID|動作|
|---|---|---|
|kill|9|強制終了|


# 4. おわり
今までLinuxコマンドについて理解が曖昧であったため、今回は良い経験となりました。
コマンドやオプションを駆使して、素早くエラーに対応できるようになります。


【参考にさせて頂いたサイト】
・[grepコマンドの詳細](https://eng-entrance.com/linux-command-grep)
・[lsofコマンドについて](https://www.atmarkit.co.jp/ait/articles/1904/18/news033.html)
・[killコマンドについて](https://eng-entrance.com/linux-command-kill)