2つのPIDリストをsshを使用してxargsに渡し、最初のPIDのみを終了します。

2つのPIDリストをsshを使用してxargsに渡し、最初のPIDのみを終了します。

私は殺したい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 process2番目のプロセスをローカルで終了しようとすることは可能ですか?

ベストアンサー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で示されるパラメータのリストから検索すると仮定し、一致させたいものだけを出力するように指示することをお勧めしますpsfoo-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を無視します)killawkxargssshd

私たちは、リモートユーザーのログインシェルがBourneのログインシェルに似ていると仮定します。たとえば、リモートユーザーのログインシェルが異なる構文を持つcshまたはrcファミリに属している場合は、これらのコマンドを調整する必要があります。

番号ではなく名前でシグナルを参照する方が良いです。より明確で信号番号がシステムによって異なる可能性があるためです(SIGKILLの場合、9はかなり一般的です)。

おすすめ記事