web-dev-qa-db-ja.com

特定の名前でプロセスを強制終了し、ルートプロセスを除外するにはどうすればよいですか?

少し前に、 pkill について知り、プロセスのグローバルクリーンアップのためにsetuid(ルート用)スクリプトで使用を開始することを念頭に置いていました。これにより、一部のクライアントが重要な権限制限ではないためにスクリプトを使用して一般的なリソースを削除できないという、多くの愚かなメンテナンスを節約できます。

ただし、苦労した後、pkill -v -u root <name>しか思いつきませんでした(これまでのところ、単純にし、sedawkgrepなどの長くて醜いスクリプトに発展しないようにするつもりです)。もちろん、それは機能しません—与えられた名前に一致するプロセス以外のすべてを殺すだけです。

必要な結果を得るpkillコマンドの短い変更バージョンはありますか?

追伸:ユーザーにある種の根本的な力を与えることの道徳性についての議論は避けたいと思います。

実行中のOSはsolaris10です。

2
Aviv

これにより、指定された名前のプロセスのリストと、指定された名前が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))
2
Mark Plotnick

私は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
1
Anil_M