デーモンを開発中ですが、動作が不安定で、新しいプロセスを作成できなくなりました (つまり、他の不正なプロセスを強制終了するための新しいプロセスを開始できません)。そのため、リモート マシンからプロセスを強制終了できるようにする必要があります。管理者権限なしでリモートで「強制終了」するにはどうすればよいでしょうか。通常のユーザーとしてリモート マシンから自分のプロセスを強制終了できない場合は、それを正解としてマークできるように教えてください。
答え1
マシン上で実行中のプロセスを強制終了するには、何らかのローカル プロセス (またはカーネル) が強制終了信号を発行する必要があります。そのため、プロセスにその信号を発行させる方法が必要です。また、新しいプロセスを作成することはできないため、既に実行中のプロセスのみに依存する方法を見つける必要があります。
ここで役立つ標準デーモンはありません。それらはすべて認証を処理し、次に新しいプロセス (シェルなど) をフォークして実行します。したがって、コンソールにアクセスできず、マシンとのやり取りがない場合は、運が悪いことになります。
コメントから判断すると、マシンにはまだシェルがあるようですね。 その場合、実行できることがあります。ls
やなどの外部プロセスは実行できません。 ただし、 、、ps
などの組み込みコマンドは実行できます(はすべてのシェルに組み込まれているわけではありませんが、bash や zsh など、ジョブ制御をサポートするすべてのシェルに組み込まれています)。echo
read
kill
kill
/proc
各プロセスには、 :の下に関連付けられたディレクトリがあります/proc/12345
。ここで、12345 はプロセス ID です。したがって、 を調べることで、既存のディレクトリに関する情報を取得できます/proc
。echo
ここでは、ワイルドカードが役立ちます。たとえば、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 -PGID
てPGID
ください。 はグループ リーダーのプロセス 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)以外に設定します(トラップできません)。trap
KILL
答え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 をお読みください。