Process

如何按特定名稱殺死程序並排除根程序

  • March 2, 2016

不久前,我們發現pkill並打算開始在 setuid(用於 root)腳本中使用它來全域清理程序。這可以為我們節省很多愚蠢的維護,因為一些客戶端不能僅使用他們的腳本刪除一般資源,因為不是重要的權限限制。

然而,經過一番掙扎,我們才想出pkill -v -u root <name>(到目前為止,我們打算讓它變得簡單,並防止演變成一個長而醜陋的腳本,用,sed等等)。當然它不起作用——它只會殺死除了與給定名稱匹配的程序之外的所有東西。awk``grep

該命令是否有任何簡短的修改版本pkill可以為我們提供所需的結果?

PS:我想避免任何關於給予使用者某種根權限的道德性的討論。

正在執行的作業系統是 solaris 10,如果這很重要的話。

這將生成具有給定名稱的程序列表,以及具有給定名稱的程序列表以 root 身份執行,然後執行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))

我正在使用 SUSE ,但假設它在 Solaris 上工作類似。

殺死使用者的程序

為了通過其使用者ID殺死一個程序,您可以執行以下操作

#pkill -U <username>

檢查使用者的程序

如果您只想在殺死特定使用者的程序之前檢查他正在執行哪些程序,您可以使用: pgrep -U <username

殺死多個使用者的程序

#pkill -U <user1>,<user2>,<user3>等等。

殺死除root以外的所有使用者

我知道您正在避免使用 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

引用自:https://unix.stackexchange.com/questions/267164