しばらく前に我々は発見した。pkill
プロセスを完全に整理するために、setuid(root用)スクリプトでこれを使い始めます。これにより、重要でない権限の制限により、一部のクライアントがスクリプトを使用して一般リソースを削除できない愚かなメンテナンス作業が大幅に削減されます。
しかし、少しの努力の後、私たちはちょうど考えましたpkill -v -u root <name>
(これまでは単純さを保ち、背中を使って長くて見苦しいスクリプトに進化するのを防ぐことを試みましたsed
)awk
。grep
もちろん動作しません。指定された名前と一致するプロセスを除くすべてのプロセスを終了します。
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