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
シェルコマンドまたはkill
C関数、信号は到達可能なすべてのプロセスに送信されます。これは、実際にコマンドまたはシステムコールを実行しているユーザーのすべてのプロセスを意味します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