web-dev-qa-db-ja.com

UIDを使用してユーザーのすべてのプロセスを強制終了する方法

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

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

何か案は? LinuxのUIDの下にPIDの動的マッピングはありますか?これはプロシージャにありませんか?

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

45
user489152

UIDの代わりにpkill -U UIDまたはpkill -u UIDまたはユーザー名を使用します。 skill -u USERNAMEが機能することもありますが、別のツールは killall -u USERNAME です。

Skill は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.

スキルのmanページによると、ユーザーIDではなく、ユーザー名のみを使用できます: http://man7.org/linux/man-pages/man1/skill.1.html

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

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

linuxでは、killallは古いものとしてマークされていませんが、数字の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)でプロセスを見つけるために使用されるユーティリティは、プロセスの完全なリストを使用すると思います(/procのいくつかのreaddirを実行します)。私は、彼らが/procデジタルサブフォルダーを反復処理し、一致するすべての見つかったプロセスをチェックすると思います。

ユーザーのリストを取得するには、 getpwent を使用します(コールごとに1人のユーザーが取得されます)。

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

60
osgx

kill Shell command または kill C function のいずれかにプロセスID引数として-1を渡すと、信号は到達可能なすべてのプロセスに送信されます。これは実際には、killコマンドまたはsyscallを実行しているユーザーのすべてのプロセスを意味します。

su -c 'kill -TERM -1' bob

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

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

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

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

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

5
David
pgrep -U username|xargs kill -9
1
Alexander

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

ps U <username> | cut -d " " -f 1 | xargs kill
0
jasonrhaas