Process
如何按特定名稱殺死程序並排除根程序
不久前,我們發現
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