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

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

Linuxシステムでは、シェルスクリプトまたはネイティブコードを介して特定のユーザーに対して実行されているすべてのプロセスを終了したいと思います。

/ procディレクトリを読み、これらの内容を見つける必要がありますか?

どんなアイデアがありますか? LinuxのUIDの下にpidの動的マッピングはありますか?これはプログラムにありませんか?

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

答え1

UIDの代わりにpkill -U UIDまたはユーザー名を使用してください。pkill -u UID時には動作することがありますskill -u USERNAME。他のツールは次のとおりです。killall -u USERNAME

技術Linux 固有のもので、現在は廃止されました。殺す移植性に優れています(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.

Skillのマニュアルページには、ユーザー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(各通貨はユーザーの注目を集めています)。

技術(procpsとprocps-ng)とそれらすべてを殺す(psmisc)ツールが使用されます。getpwnamライブラリ呼び出しは-uオプションの引数を解析し、ユーザー名のみを解析します。pkill(procpsとprocps-ng)atolとgetpwnamを一緒に使う-u/パラメータを解析し、-U数値とテキストのカスタマイズを許可します。

答え2

プロセスIDパラメータに-1を渡すとkillシェルコマンドまたはkillC関数、信号は到達可能なすべてのプロセスに送信されます。これは、実際にコマンドまたはシステムコールを実行しているユーザーのすべてのプロセスを意味しますkill

su -c 'kill -TERM -1' bob

Cでは(エラーチェックを省略):

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

答え3

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

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

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

答え4

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

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

関連情報