Linux でリモート プロセスを見つけて終了するにはどうすればよいですか?

Linux でリモート プロセスを見つけて終了するにはどうすればよいですか?

デーモンを開発中ですが、動作が不安定で、新しいプロセスを作成できなくなりました (つまり、他の不正なプロセスを強制終了するための新しいプロセスを開始できません)。そのため、リモート マシンからプロセスを強制終了できるようにする必要があります。管理者権限なしでリモートで「強制終了」するにはどうすればよいでしょうか。通常のユーザーとしてリモート マシンから自分のプロセスを強制終了できない場合は、それを正解としてマークできるように教えてください。

答え1

マシン上で実行中のプロセスを強制終了するには、何らかのローカル プロセス (またはカーネル) が強制終了信号を発行する必要があります。そのため、プロセスにその信号を発行させる方法が必要です。また、新しいプロセスを作成することはできないため、既に実行中のプロセスのみに依存する方法を見つける必要があります。

ここで役立つ標準デーモンはありません。それらはすべて認証を処理し、次に新しいプロセス (シェルなど) をフォークして実行します。したがって、コンソールにアクセスできず、マシンとのやり取りがない場合は、運が悪いことになります。


コメントから判断すると、マシンにはまだシェルがあるようですね。 その場合、実行できることがあります。lsやなどの外部プロセスは実行できません。 ただし、 、、psなどの組み込みコマンドは実行できます(はすべてのシェルに組み込まれているわけではありませんが、bash や zsh など、ジョブ制御をサポートするすべてのシェルに組み込まれています)。echoreadkillkill

/proc各プロセスには、 :の下に関連付けられたディレクトリがあります/proc/12345。ここで、12345 はプロセス ID です。したがって、 を調べることで、既存のディレクトリに関する情報を取得できます/procechoここでは、ワイルドカードが役立ちます。たとえば、cd /proc; echo [0-9]*実行中のすべてのプロセスのプロセス ID が表示されます。シェルが zsh の場合、glob 修飾子を使用して多くの操作を実行できます。たとえば、echo /proc/*(u$UID)自分のユーザー ID で実行されているプロセスのみを表示します。

フォークせずにファイルの内容を表示する方法は

while read -r line; do
  echo "$line"
done </path/to/file

にすべてのプロセスを渡すことで、一度に多くのプロセスを強制終了できますkill。デーモンに属するプロセスを特定した場合は、 でそのプロセス グループを強制終了してみkill -9 -PGIDPGIDください。 はグループ リーダーのプロセス ID です。 でプロセス 123 のプロセス グループ ID を見つけることができます</proc/123/stat read pid tcomm state ppid pgrp sid more; echo $pgrp。(同じ情報が にもっと読みやすい形式で存在しますが/proc/123/、今はそれを読むのに適した状態ではありません。) また、 ですべてのプロセス (元のシェルを含む) にシグナルを送信することもできます。

trap : NUM
kill -NUM -1

コマンドによってシェルがシグナルを無視しないようKILLに、NUM の値を (9)以外に設定します(トラップできません)。trapKILL

答え2

以下の情報はhttp://www.cyberciti.biz/faq/kill-process-in-linux-or-terminate-a-process-in-unix-or-linux-systems/

Linux/UNIX で kill コマンドを使用してプロセスを強制終了する

kill コマンドは、Linux と UNIX/BSD のようなオペレーティング システムの両方で動作します。

ステップ1: まず、プロセスPID(プロセスID)を見つける必要があります

プロセス ID (PID) を確認するには、ps コマンドまたは pidof コマンドを使用します。構文: ps aux | grep processname pidof processname

たとえば、プロセス名が lighttpd の場合、次のコマンドのいずれかを使用してプロセス ID を取得できます。

ps aux | grep lighttpdOutput

lighttpd  3486  0.0  0.1   4248  1432 ?        S    Jul31   0:00 /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
lighttpd  3492  0.0  0.5  13752  3936 ?        Ss   Jul31   0:00 /usr/bin/php5-cg

または、実行中のプログラムのプロセス ID を見つけるために使用される pidof コマンドを使用します。

pidof lighttpd

出力

3486

ステップ 2: PID (プロセス ID) を使用してプロセスを強制終了する

上記のコマンドは、lighttpd プロセスの PID (3486) を示します。次に、この PID を使用してプロセスを終了します。

# kill 3486

または

# kill -9 3486

ここで、-9 はプロセスを強制終了する特別な Kill シグナルです。

killall コマンドの例

UNIX システムでは killall コマンドを使用しないでください (Linux 専用のコマンド)。killall コマンドを使用することもできます。killall コマンドは、名前でプロセスを強制終了します (PID を見つける必要はありません)。

# killall -9 lighttpd

Firefox プロセスを終了します:

# killall -9 firefox-bin

前に述べたように、UNIX システムでの killall は別のことを行います。特定のプロセスだけでなく、すべてのプロセスを強制終了します。UNIX システムでは killall を使用しないでください (kill -9 を使用してください)。

答え3

コメントにもあるように、現時点では管理者だけがあなたを助けることができます。Perl クックブックゾンビの正しい対処方法については、セクション 16.19 をお読みください。

関連情報