「kill -9」がブラウザとサーバーをシャットダウンするのはなぜですか?

「kill -9」がブラウザとサーバーをシャットダウンするのはなぜですか?

kill -9時には、Railsサーバーをシャットダウンするための最後の手段として使用する必要があります。残念ながら、これはあまりにも頻繁に実行する必要があるため、これを行うためにbash_profileにヘルパー関数を作成しました。

この操作を手動で実行すると、ps aux | grep '[r]ails]pid(例12345:)が取得され、kill -9 12345サーバーがシャットダウンされ、ブラウザはそのまま残ります。しかし、私の機能もブラウザを終了させたくありません。

function running {
  ps -p $(lsof -i :3000 -t) &> /dev/null
}

function k9 {
  if running
  then
    kill -9 $(lsof -i :3000 -t)
  else
    echo "Rails server is not running"
  fi
}

lsof -i :3000 -t得られたpidが私が得たpidと同じことを確認しましたがps aux、私が間違っているのでしょうか?

答え1

質問:

を使用すると、lsof -i :3000 -tポート3000に接続されているすべてのプロセスを見つけることができます。離れて横。

スクリプトを使用すると、ブラウザはポート3000でRailsサーバーに接続しているように見えます。違いはブラウザを使うこととkill

これは、ブラウザがtoo出力に一覧表示されlsof終了されることを意味します。

ローカルまたは他の場所でポート 3000 を使用するプロセスではなく、Rails サーバーと同様のプロセスを終了する方が良いでしょう。


一般的な解決策:

pkill~である正しいツール仕事。
~のため努力する一致させるターゲット、使用pgrep、一致方法は同じです。

サーバーのコマンドライン(psに示すように)が次から始まる場合コマンド名サーバーインスタンスを識別するには、次のものを使用できますpkill servercommand
コマンドラインパラメータはを追加します。-f例: 。pkill -f serverargument

終了したプロセスpkillのみが一覧表示されますので、pgrep終了するプロセスを試してみてください。 pidだけでなく、コマンドラインを一覧表示する-aオプションを追加します。pgrep


pgrep / pkillの例:

使用例-f:によると、ps次の2つのインスタンスがxbindkeys実行されています。

$ ps aux|grep '[x]bindkeys'
26719 ?        S      0:00 xbindkeys -f /tmp/xbindkeysrc-tmp
32046 ?        S      0:00 xbindkeys -f /home/auser/.xbindkeysrc

これで、両方のインスタンスを見つけることができます。

$ pgrep xbindkeys
26719
32046

または、次のコマンドを表示します。

$ pgrep -a xbindkeys
26719 xbindkeys -f /tmp/xbindkeysrc-tmp
32046 xbindkeys -f /home/auser/.xbindkeysrc

または、コマンドライン引数を使用してインスタンスの1つを一致させます。

$ pgrep -f '/home/auser/.xbindkeysrc'
32046

そうでない場合、-f一致するプロセスはありません。

$ pgrep '/home/auser/.xbindkeysrc'

最後に、プロセスに信号を送信しますkill。たとえば、次のようになります。

$ pkill -f '/home/auser/.xbindkeysrc'


独自のアプローチに基づく代替ソリューション:

解決策はpkillより一般的ですが、元のアプローチに従うには、lsof次のコマンドを使用できます。より厳しい 「任意の方法でローカルポートを使用するすべてのプログラム、または任意の方法でリモートポートを使用するすべてのプログラム」ではなく、「該当ポートをリッスンするすべての
ローカルサーバー」と一致します。

このオプションは-sTCP:LISTENリストをリスニングポートに制限し、ローカルポートのみを受信できるため、ローカルポートのみを受信できます。

if次のテストで使用できます。

if lsof -i :3000 -sTCP:LISTEN -t >/dev/null ; then
    echo running
else
    echo not running
fi



Kill -9に示すようにSIGKILLを使用する際の注意:

KILL信号は次のようpkillに使用されますkill

$ pkill -9 -f '/home/auser/.xbindkeysrc'

しかし、ほとんどの場合、これは基本信号に比べて利点を提供せず、-15場合によっては問題が発生します。だから習慣にするのは良いことではありません。

見ていつ-9プロセスを終了しないでください。-9デフォルトを使用したくない理由を理解してください。

関連情報