Macのターミナルから開いているポートを閉じるにはどうすればよいですか?


197

クライアントから通信するために、Javaクラスからポート5955を開きました。完了後にこのポートを閉じるにはどうすればよいですか?また、ポートが開いているか閉じているかを示すコマンドはどれですか?


1
どのようにしてそのポートを開きましたか?Javaアプリケーションのポートの開閉とファイアウォールのどちらから話しているのかは明確ではありません。
mariosangiorgio 2012

回答:


394
  1. 解放したいポート番号(例えば、5955)を占有しているプロセスID(PID)を見つけます。

    sudo lsof -i :5955
    
  2. 現在PIDを使用してポートを使用しているプロセスを強制終了します

    sudo kill -9 PID
    

32
-9の送信は、プロセスを強制終了する最初の試みであってはならず、非常に悪い習慣です。私が覚えているように、最初にkill PID(-15を意味する)を使用してから、-2と-1を試してください。-9は、他のすべてのオプションが機能しない場合のみ、最後の手段です。
Meow

3
@Meowによって提案され、これが私のために働いていたとして、任意のフラグなしキルPIDをした
トニリー

39

プロセスを見つけるには、以下を試してください。

sudo lsof -i :portNumber

現在PIDを使用してポートを使用しているプロセスを強制終了します

kill PID

次に、ポートが閉じているかどうかを確認します。そうでない場合は、以下を試してください。

kill -9 PID

以前のバージョンが機能しない場合にのみ、次のことを行います

sudo kill -9 PID

安全のために。この場合も、ポートを開いた方法によっては、これは問題にならない場合があります。


25

ただし、ポートを開いても、同じ方法でポートを閉じます。たとえば、ソケットを作成してポート0.0.0.0:5955にバインドし、listenを呼び出した場合は、同じソケットを閉じます。

ポートを開いているプロセスを強制終了することもできます。

どのプロセスがポートを開いているかを知りたい場合は、これを試してください:

lsof -i :5955

ポートが開いているかどうかを知りたい場合は、同じlsofコマンドを実行できます(開いているプロセスがある場合は開いています。それ以外の場合は開いていません)。または、次のように接続を試行することもできます。

nc localhost 5955

出力なしですぐに戻る場合、ポートは開いていません。

技術的に言えば、開いているポートではなく、ホストとポートの組み合わせであることは、言及する価値があります。たとえば、10.0.1.2としてLANに接続している場合は、ソケットを127.0.0.1:5955または10.0.1.2:5955にバインドできます。一方が他方に影響を与えたり、0.0.0.0にバインドしたりすることはありません。 :5955は両方を同時に処理します。ifconfigコマンドを使用して、コンピューターのすべてのIPv4およびIPv6アドレスを表示できます。


24

非常にシンプルな検索ポート5900:

sudo lsof -i :5900

次に59553をPIDと見なします

sudo kill 59553

1
これは既存の回答に何も追加しません!
ハテフ'12

16

2018年、MacOS HighSierraを使用して私がうまくいったことは次のとおりです。

sudo lsof -nPi:yourPortNumber

次に:

sudo kill -9 yourPIDnumber


1
lsof -nPiポート番号が実際に出力に表示され、何を殺しているのかをよりよく理解できるため、少し優れています。
リッチストーン

1
また、すべてのリスニングポートの情報を確認するだけでも役立ちますsudo lsof -nPi | grep LISTEN
。–

14

ワンライナーがベスト

kill -9 $(lsof -i:PORT -t) 2> /dev/null

例:Macで、ポート9604をクリアしたかった。次のコマンドは魅力のように機能した

 kill -9 $(lsof -i:9604 -t) 2> /dev/null 

6

この最初のコマンドを使用して、特定のポートを所有するプロセスを強制終了することもできます。

sudo netstat -ap | grep :<port_number>

たとえば、このプロセスがポート8000 TCPを保持しているとすると、次のコマンドが実行されます。

sudo netstat -ap | grep :8000

たとえば、ポート8000を保持するプロセスに対応する行を出力します。

tcp  0  0 *:8000   *:* LISTEN  4683/procHoldingPort

この場合、procHoldingPortはポートを開いたプロセスの名前、4683はそのpid、8000(TCPであることに注意)はそれが保持しているポート番号(閉じたい)です。

次に、上記の例に従って、プロセスを強制終了します。

kill  4683

他の人がここで言及したように、それが機能しない場合(引数として-9を指定してkillを使用してみてください):

kill -9 4683

繰り返しになりますが、一般的には、可能であればSIGKILL(-9)を送信しないことをお勧めします。

乾杯、

男。


5

上記のように、とlsof組み合わせて使用しkillます。しかし、このプロセスを自動化するための簡単なbashスクリプトを作成しました。

このスクリプトを使用するとkillport 3000、どこからでも簡単に入力でき、ポートで実行されているすべてのプロセスが強制終了されます3000

https://github.com/xtrasimplicity/killport


1
あなたは私の日を救った。何らかの理由lsofでとの組み合わせでkill何も返されず、スクリプトがmacOS Sierraでハングしました。しかしkillport、魅力のように機能し、より高速です。ありがとう!
2016

4

このための関数を作成しました。

function free_port() {
    if [ -z $1 ] 
    then
        echo no Port given
    else
        PORT=$1;
        PID=$(sudo lsof -i :$PORT) # store the PID, that is using this port 

        if [ -z $PID ] 
        then
            echo port: $PORT is already free.
        else
            sudo kill -9 $PID # kill the process, which frees the port
            echo port: $PORT is now free.
        fi
    fi
}

free_port 80 # you need to change this port number

このコードブロックを端末にコピーして貼り付けると、目的のポートが解放されます。最後の行でポート番号を変更することを忘れないでください。



1

ポートを開いたプログラムが終了すると、ポートは自動的に閉じられます。このサーバーを実行しているJavaプロセスを強制終了した場合、それでそれが実行されます。


-1
  1. まず、必要なポートを占有しているプロセスID(pid)を見つけます(例:5434)

    ps aux | grep 5434

2.そのプロセスを殺す

   kill -9 <pid>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.