私は殺したい2つのPIDのリストを検索しています。私のパイプラインは次のとおりです。
ps -ef | grep foo | grep -v grep | awk {'print $2'} | xargs kill -9
ローカルでこれを行うと、両方のプロセスが終了します。しかし、SSHで使用すると
ssh foo@<IP Address> "ps -ef | grep foo | grep -v grep | awk {'print $2'} | xargs kill -9"
2 つの PID のうち 1 つだけが削除されます。kill: <PID>: No such process
2番目のプロセスをローカルで終了しようとすることは可能ですか?
答え1
ローカルシェルコマンドラインは二重引用符で$2
囲まれているため、ローカルシェルによって拡張されます(空の文字列である可能性があります)。
したがって、リモートホストで実行されるコマンドは次のようになります。
ps -ef | grep foo | grep -v grep | awk {'print '} | xargs kill -9
このawk
コマンドは機能せず(すべての行を印刷します)、xargs
最終的に実行されます。
kill -9 <all-the-words-present-in-the-output-of-ps|grep...>
これには、pidとppid、ユーザー名が含まれます。
また、kill コマンドの pid がリストにある場合は自分で終了するため、リスト内の残りのプロセスを終了することはできません。
希望する場所は次のとおりです。
ssh foo@<IP Address> 'pkill -KILL -f foo'
(コマンドラインに含まれるすべてのプロセスを終了します(少なくとも最初の数キロバイト)foo
。)
または、リモートシステムにコマンドがない場合pkill
:
ssh foo@<IP Address> '
ps -Ao pid= -o args= |
awk "/[f]oo/ {print \$1}" |
xargs kill -s KILL'
awkコードのローカル側では一重引用符(変数拡張なし)を使用し、リモートシェルコマンドラインでは二重引用符を使用するため、リモートシェルによって拡張されないように$
inをエスケープする必要があります。$1
awk
はい、superset grep
、通常一緒にパイプする必要はありません。使い方が示すように、psで示されるパラメータのリストから検索すると仮定し、一致させたいものだけを出力するように指示することをお勧めしますps
。foo
-f
リモートユーザー(ここではfooユーザーとfooでsshing)のすべてのプロセスを終了するには、次のようにします。
ssh foo@<IP Address> 'kill -s KILL -- -1'
これにより、ユーザーが終了する権限を持つすべてのプロセスが終了します。一般ユーザーの場合、実際のユーザーまたは保存されたユーザーIDが終了プロセスの実際のユーザーIDまたは有効ユーザーIDと同じであるすべてのプロセスを意味します。
または:
ssh foo@<IP Address> 'pkill -KILL -U "$(id -u)"'
(またはpkill -U foo
)。実際のユーザーIDがリモートユーザーの有効なユーザーIDと同じであるすべてのプロセスを終了します。
またはこれを行うこともできます:
ssh foo@<IP Address> '
trap "" HUP
ps -Ao sid= -o pid= -U "$(id -u)" |
awk "\$1 != $(ps -eo sid= -p "\$\$") {print \$2}" |
xargs kill -s KILL'
(自分、シェル、またはSIGHUPを殺さsid
ないように選択し、ユーザープロセスを殺すと、この信号が送信された場合はSIGHUPを無視します)kill
awk
xargs
sshd
私たちは、リモートユーザーのログインシェルがBourneのログインシェルに似ていると仮定します。たとえば、リモートユーザーのログインシェルが異なる構文を持つcshまたはrcファミリに属している場合は、これらのコマンドを調整する必要があります。
番号ではなく名前でシグナルを参照する方が良いです。より明確で信号番号がシステムによって異なる可能性があるためです(SIGKILLの場合、9はかなり一般的です)。
答え2
要するにこれを試してみてください
ssh user_name@ip_address "pkill -9 foo"
またはもっと長くしたい場合
ssh user_name@ip_address "ps aux | grep '[f]oo' | awk '{print \"kill -9 \"\$2}' | bash -v"