특정 이름으로 프로세스를 종료하고 루트 프로세스를 제외하는 방법

특정 이름으로 프로세스를 종료하고 루트 프로세스를 제외하는 방법

얼마 전 우리는 발견했습니다.pkill우리는 프로세스를 전체적으로 정리하기 위해 setuid(루트용) 스크립트에서 이것을 사용하기 시작할 것입니다. 이는 중요하지 않은 권한 제한으로 인해 일부 클라이언트가 스크립트를 사용하여 일반 리소스를 삭제할 수 없는 어리석은 유지 관리 작업을 많이 줄여줍니다.

그러나 약간의 노력 끝에 우리는 방금 생각해냈습니다 pkill -v -u root <name>(지금까지는 단순함을 유지하고 , 등을 사용하여 길고 보기 흉한 스크립트로 발전하는 것을 방지하려고 했습니다 sed) awk. grep물론 작동하지 않습니다. 주어진 이름과 일치하는 프로세스를 제외한 모든 프로세스를 종료합니다.

pkill원하는 결과를 제공하는 이 명령의 간단한 수정 버전이 있습니까 ?

추신: 사용자에게 일종의 루트 권한을 부여하는 윤리에 대한 논의는 피하고 싶습니다.

실행 중인 운영 체제는 Solaris 10(사용 가능한 경우)입니다.

답변1

이것은 주어진 이름을 가진 프로세스 목록과 루트로 실행되는 주어진 이름을 가진 프로세스 목록을 생성한 다음 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

관련 정보