少し前に、 pkill
について知り、プロセスのグローバルクリーンアップのためにsetuid(ルート用)スクリプトで使用を開始することを念頭に置いていました。これにより、一部のクライアントが重要な権限制限ではないためにスクリプトを使用して一般的なリソースを削除できないという、多くの愚かなメンテナンスを節約できます。
ただし、苦労した後、pkill -v -u root <name>
しか思いつきませんでした(これまでのところ、単純にし、sed
、awk
、grep
などの長くて醜いスクリプトに発展しないようにするつもりです)。もちろん、それは機能しません—与えられた名前に一致するプロセス以外のすべてを殺すだけです。
必要な結果を得るpkill
コマンドの短い変更バージョンはありますか?
追伸:ユーザーにある種の根本的な力を与えることの道徳性についての議論は避けたいと思います。
実行中のOSはsolaris10です。
これにより、指定された名前のプロセスのリストと、指定された名前がrootとして実行されているプロセスのリストが生成され、comm
を実行して、最初のリストで2番目のリストにないプロセスを見つけてから強制終了します。それら。
#!/bin/ksh
if test $# != 1
then
echo usage: "$0" processname
exit 1
fi
pname="$1"
kill $(comm -23 <(pgrep "$pname"|sort -n) <(pgrep -u root "$pname"|sort -n))
私はSUSEを使用していますが、Solarisでも同様に機能すると想定しています。
ユーザーIDでプロセスを強制終了するには、次のようにします。
#pkill -U <username>
特定のユーザーのプロセスを強制終了する前に、特定のユーザーに対して実行されているプロセスを確認するだけの場合は、次を使用できます。pgrep -U <username
#pkill -U <user1>,<user2>,<user3>
等々。
私はあなたがsed、awk、grepを避けていることを知っています。ただし、各ユーザー名を入力するよりも、スクリプトを作成する方が簡単です。これがサンプルです。本番環境で実行する前に、sanboxを確認してください。
ps -aef |grep -v UID |grep -v root |awk '{print $1}'
|sort -u |while read name
do
echo "Killing process for user $name"
pkill -U $name
done