UIDを使用してすべてのユーザーのプロセスを強制終了するにはどうすればよいですか


41

Linuxシステムのシェルスクリプトまたはネイティブコードのいずれかから、特定のユーザーの実行中のすべてのプロセスを強制終了します。

/ procディレクトリを読んでこれらを探す必要がありますか?

何か案は?LinuxのUIDの下にpidの動的マッピングはありますか?これはprocにありませんか?

そうでない場合、このリストはどこで維持されますか?私はそれから読むべきですか?また、システム内のすべてのUIDの静的リストはどこにあるので、このユーザーが存在することを検証してから、その下で実行されているすべてのプロセスを強制終了できますか?


6
これを行うツール(pkill、slay、他のものが存在する)が必要ですか、それとも自分で作成しますか?前者の場合、スーパーユーザーのスタック交換サイトの方がおそらく優れています。後者の場合、/ procをスキャンして、特定のユーザーがすべてのプロセスのメモを作成する方法があります。たとえば、pkillユーティリティのソースコードは、その方法を示します。

@LarsWirzeniusのコメントを踏まえて、この質問の内容を明確にできますか?ありがとう!
カレブ

@Caleb:/ procを読むことでプロセスを強制終了したかったのです。また、「kill」、「pkill」、「skill」などがシステムで使用できないこともわかりました。その場合、/ procを読み取り、1人のユーザーの下でプロセスを取得する方法を見つけるために、シェルスクリプトの代替を検討する必要があると思います。何か案は?
-user489152

1
「すべてのUIDの静的リスト...このユーザーが存在することを検証できるように」に関して:ユーザーIDを検証するようなものはありません。ユーザー名はデータベースから取得されますが、ユーザーIDは実行中のプロセスがsetuid()選択するものです。
ジル 'SO-悪である停止

回答:


52

UIDの代わりにpkill -U UIDor pkill -u UIDまたはusernameを使用します。動作する場合もskill -u USERNAMEあれば、別のツールがありkillall -u USERNAMEます。

スキルはLinux 固有でしたが、現在は時代遅れであり、pkillはより移植性があります(Linux、Solaris、BSD)。

pkillは、数値とシンボリックの両方のUIDを有効にします(有効で実際のものです)http://man7.org/linux/man-pages/man1/pkill.1.html

pkill-...名前およびその他の属性に基づいたプロセスのシグナル

    -u, --euid euid,...
         Only match processes whose effective user ID is listed.
         Either the numerical or symbolical value may be used.
    -U, --uid uid,...
         Only match processes whose real user ID is listed.  Either the
         numerical or symbolical value may be used.

スキルのマニュアルページには、ユーザーIDではなくユーザー名のみを使用できることが記載されています:http : //man7.org/linux/man-pages/man1/skill.1.html

スキル、巧みな...これらのツールは時代遅れで移植性がありません。コマンド構文の定義が不十分です。killall、pkillの使用を検討してください

  -u, --user user
         The next expression is a username.

killallはLinuxでは時代遅れとしてマークされていませんが、番号UIDでも機能しません。ユーザー名のみ:http : //man7.org/linux/man-pages/man1/killall.1.html

killall-名前でプロセスを強制終了

   -u, --user
         Kill only processes the specified user owns.  Command names
         are optional.

Linux / Solarisスタイルの/ proc(procfs)でプロセスを見つけるために使用されるユーティリティは、プロセスの完全なリストを使用します(readdirを実行します/proc)。/procデジタルサブフォルダーを反復処理し、見つかったすべてのプロセスの一致をチェックすると思います。

ユーザーのリストを取得するには、を使用しますgetpwent(呼び出しごとに1人のユーザーを取得します)。

skill(procps&procps-ng)ツールとkillall(psmisc)ツールは両方ともgetpwnamライブラリ呼び出しを使用して-uオプションの引数を解析し、ユーザー名のみが解析されます。pkill(procps&procps-ng)は、atolとgetpwnamの両方を使用して-u / -U引数を解析し、数値とテキストの両方のユーザー指定子を許可します。


1
pkillは時代遅れではありません。Linuxの外では移植できないかもしれませんが、問題は特にLinuxについてでした。

1
ユーザーのリストを取得するには、1つのライナーを使用します:getent passwd | awk -F: '{print $ 1}'
Petesh

Cのsystem()呼び出しから「kill -ju UID」のようなコマンドを指定するとどうなりますか?

1
組み込みLinuxですか?スキル、スキル、キルオールはありませんか?busybox組み込みシェルでさえ、pkillとkillallがあります。
osgx

2
killall -u USERNAMEチャームのように働いた
-michalzuber

8

プロセスID引数として-1をkillシェルコマンドまたはkillC関数のいずれかに渡すと、シグナルは到達可能なすべてのプロセスに送信されkillます。実際には、コマンドまたはsyscallを実行しているユーザーのすべてのプロセスを意味します。

su -c 'kill -TERM -1' bob

Cの場合(エラーチェックは省略):

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}

5

UNIX / Linuxディストリビューションでpkill機能が使用できない場合、次のコマンドをrootユーザーとして実行できます。

ps -ef | grep username | grep -v grep | awk '{print $2}' | xargs kill

ここで、usernameは削除するプロセスのユーザーです


または単にpkill -U username
osgx


0

これは私にとってはうまくいきました。実行してユーザー名でプロセスのすべてのPIDを検索し、ps U <username>そこから移動できます。これを試して:

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