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
デフォルトを使用したくない理由を理解してください。