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


1

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


pkillでプロセスIDは必要ありません。ちょうどプロセス名
ジョーフィリップス

pkill grepのコマンドは、killはプロセスIDを使用します。とはいえ、新しいプロセスであるフォークボムの立ち上げを止めるのは何ですか?
ewanm89

2
私はまったくフォローしていません。新しいプロセスを作成できない場合、どのようにマシンに接続してから実行しますpkillkill?少なくとも2つの新しいプロセスを作成する必要があります。
ダグ・ハリス

@ダグ:私の悪い、私はあなたが引数としてサーバー名を提供することができ、それがマシンに行き、プロセスを殺すだろうと思った。pkillがその機能を持っていたとしても、今は気に入らないので、おそらく私としてログインする必要があります。だから、私は自分でこれを行うことはできず、管理者が私のためにこれらの仕事を殺すことができる唯一の人であるように見えますか?
ステファン

@ewanm:フォークボムが何であるか、またはマシン上でコマンドを実行できなくなった理由が正確にはわかりません。何かをするたびに(ls、pwdなど)、「No more processes」というエラーが表示されます。自分でこの問題を解決することはできないだろうという印象を受けています。
ステフェンム

回答:


7

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

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


あなたのコメントから、まだマシン上にシェルがあるように聞こえます。次に、できることがあります。あなたのような、任意の外部プロセスを実行することはできませんlsps。しかし、あなたのような組み込みコマンドを実行することができechoreadおよびkillkillすべてのシェルに内蔵、それは、そのようなbashのやzshのようジョブ制御をサポートするすべてのシェル、1つであるされていません)。

各プロセスには、次のディレクトリが関連付けられています/proc/proc/1234512345はプロセスIDです。したがって、を探索することでexisingについての情報を得ることができます/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 -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(9)以外のNUMの値を選択して、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)を見つける必要があります

psコマンドまたはpidofコマンドを使用して、プロセスID(PID)を見つけます。構文:ps aux | grepプロセス名pidofプロセス名

たとえば、プロセス名が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を使用)。


4
を使用する前にkill / killall 試してください。巧妙に作成されたデーモンはSIGTERMシグナル(のデフォルト)をキャッチし、シャットダウンする前に何らかのクリーンアップを行う場合があります。システムリソースに親切にして、デーモンがそれらをうまく解放できるようにします。それでもデーモンが死なない場合は、SIGKILL()を送信してください。-9-9kill-9
ダグハリス

とてもすごい!残念ながら、プロセスを強制終了する方法を知っているのは、マシンにログオンできないときにプロセスを強制終了する方法です。
ステファン

1
@Doug:ありがとう、いつもなぜ-9を殺さないのかといつも疑問に思っていました!啓発をありがとう。
ステファン

1

コメントで言ったように、この時点であなたを助けることができるのは管理者だけです。Perlクックブックを入手しセクション16.19を読んでゾンビの正しい処理方法を確認することをお勧めします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.