特定の名前でプロセスを終了し、ルートプロセスを除外する方法

特定の名前でプロセスを終了し、ルートプロセスを除外する方法

しばらく前に我々は発見した。pkillプロセスを完全に整理するために、setuid(root用)スクリプトでこれを使い始めます。これにより、重要でない権限の制限により、一部のクライアントがスクリプトを使用して一般リソースを削除できない愚かなメンテナンス作業が大幅に削減されます。

しかし、少しの努力の後、私たちはちょうど考えましたpkill -v -u root <name>(これまでは単純さを保ち、背中を使って長くて見苦しいスクリプトに進化するのを防ぐことを試みましたsedawkgrepもちろん動作しません。指定された名前と一致するプロセスを除くすべてのプロセスを終了します。

pkill必要な結果を提供するこのコマンドの簡単な修正版はありますか?

PS:ユーザーに一種のルート権限を与える倫理についての議論は避けたいと思います。

実行中のオペレーティングシステムはSolaris 10(利用可能な場合)です。

答え1

これは、指定された名前を持つプロセスのリストとルートとして実行される特定の名前のプロセスのリストを作成し、2番目のリストにない最初のリストからcommプロセスを見つけて終了します。

#!/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

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

関連情報