UID를 사용하여 사용자의 모든 프로세스를 종료하는 방법

UID를 사용하여 사용자의 모든 프로세스를 종료하는 방법

Linux 시스템에서 쉘 스크립트나 네이티브 코드를 통해 특정 사용자에 대해 실행 중인 모든 프로세스를 종료하고 싶습니다.

/proc 디렉토리를 읽고 이러한 내용을 찾아야 합니까?

어떤 아이디어가 있나요? Linux의 UID 아래에 pid의 동적 매핑이 있습니까? 이거 프로그램에 없나요?

그렇지 않다면 이 목록은 어디에 유지되나요? 그것부터 읽어야 할까요? 또한 사용자가 존재하는지 확인한 다음 해당 사용자로 실행 중인 모든 프로세스를 종료할 수 있도록 시스템의 모든 UID에 대한 정적 목록은 어디에 있습니까?

답변1

UID 대신 pkill -U UID또는 사용자 이름을 사용하세요 . pkill -u UID때로는 작동할 수도 있습니다 skill -u USERNAME. 다른 도구는 다음과 같습니다.killall -u USERNAME.

기술Linux에만 해당되며 이제 더 이상 사용되지 않습니다.죽이다이식성이 뛰어납니다(Linux, Solaris, BSD).

pkill은 유효하고 참인 숫자 및 기호 UID를 허용합니다.http://man7.org/linux/man-pages/man1/pkill.1.html

pkill - ...이름 및 기타 속성을 기반으로 한 신호 처리

    -u, --euid euid,...
         Only match processes whose effective user ID is listed.
         Either the numerical or symbolical value may be used.
    -U, --uid uid,...
         Only match processes whose real user ID is listed.  Either the
         numerical or symbolical value may be used.

Skill의 매뉴얼 페이지에는 사용자 ID가 아닌 사용자 이름만 허용되는지 여부가 표시됩니다.http://man7.org/linux/man-pages/man1/skill.1.html

기술, 그렇습니다. 도구는 오래되었고 이식성이 없습니다. 명령 구문이 잘 정의되어 있지 않습니다. killall, pkill 사용을 고려해보세요.

  -u, --user user
         The next expression is a username.

Killall은 Linux에서 더 이상 사용되지 않는 것으로 표시되어 있지만 숫자 UID에서만 작동하지 않습니다.http://man7.org/linux/man-pages/man1/killall.1.html

Killall - 이름으로 프로세스 종료

   -u, --user
         Kill only processes the specified user owns.  Command names
         are optional.

내 생각에 Linux/Solaris 스타일 /proc(procfs)에서 프로세스를 찾는 유틸리티는 전체 프로세스 목록을 사용합니다(일부 readdir 작업 수행 /proc). 내 생각에 그들은 /proc하위 폴더 수를 반복하고 발견된 각 프로세스가 일치하는지 확인합니다.

사용자 목록을 얻으려면 다음을 사용하십시오.getpwent(각 통화는 사용자의 관심을 끌고 있습니다).

기술(procps 및 procps-ng) 및그들 모두를 죽일(psmisc) 도구가 사용됩니다.getpwnam라이브러리 호출은 -u옵션의 인수를 구문 분석하고 사용자 이름만 구문 분석합니다. pkill(procps 및 procps-ng)atol과 getpwnam을 함께 사용-u/ 매개변수를 구문 분석 -U하고 숫자 및 텍스트 사용자 지정자를 허용합니다.

답변2

프로세스 ID 매개변수로 -1을 전달하면kill쉘 명령또는killC 함수, 신호는 도달할 수 있는 모든 프로세스로 전송됩니다. 이는 실제로 명령이나 시스템 호출을 실행하는 사용자의 모든 프로세스를 의미합니다 kill.

su -c 'kill -TERM -1' bob

C에서는(오류 검사 생략):

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}

답변3

UNIX/Linux 배포판에서 pkill 기능을 사용할 수 없는 경우 루트로 다음 명령을 실행할 수 있습니다.

ps -ef | grep username | grep -v grep | awk '{print $2}' | xargs kill

여기서 username은 삭제하려는 프로세스의 사용자입니다.

답변4

이것은 나에게 잘 작동합니다. 사용자 이름으로 모든 프로세스의 PID를 찾아 ps U <username>거기에서 이동할 수 있습니다. 이 시도:

ps U <username> | cut -d " " -f 1 | xargs kill

관련 정보