Linuxシステムのシェルスクリプトまたはネイティブコードから、特定のユーザーの実行中のすべてのプロセスを強制終了したい。
/ procディレクトリを読んでこれらを探す必要がありますか?
何か案は? LinuxのUIDの下にPIDの動的マッピングはありますか?これはプロシージャにありませんか?
そうでない場合、このリストはどこに保持されますか?私はそれから読むべきですか?また、システム内のすべてのUIDの静的リストはどこにあるので、このユーザーが存在することを確認してから、その下で実行されているすべてのプロセスを強制終了できますか?
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
引数を解析し、数値とテキストの両方のユーザー指定子を許可します。
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は、削除するプロセスのユーザーです。
pgrep -U username|xargs kill -9
これは私にとってはうまくいきました。 ps U <username>
を実行すると、ユーザー名でプロセスのすべてのPIDを検索してそこから移動できます。これを試して:
ps U <username> | cut -d " " -f 1 | xargs kill