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


41

Linux 시스템의 쉘 스크립트 또는 기본 코드에서 특정 사용자의 모든 실행중인 프로세스를 종료하고 싶습니다.

/ proc 디렉토리를 읽고 이것들을 찾아야합니까?

어떤 아이디어? Linux의 UID에서 pid의 동적 매핑이 있습니까? 이 과정에서 그렇지 않습니까?

그렇지 않은 경우이 목록은 어디에 유지됩니까? 내가 읽어야 할까? 또한 시스템에있는 모든 UID의 정적 목록이 어디에 있습니까? 그래서이 사용자가 존재하는지 확인한 다음 그 아래에서 실행중인 모든 프로세스를 강제 종료합니까?


6
이 작업을 수행하는 도구 (pkill, slay 등)가 필요합니까, 아니면 직접 작성 하시겠습니까? 전자의 경우 수퍼 유저 스택 교환 사이트가 더 좋습니다. 후자의 경우 / proc을 스캔하고 특정 사용자가 모든 프로세스를 기록하는 것이 좋습니다. 예를 들어, pkill 유틸리티의 소스 코드는이를 수행하는 방법을 보여줍니다.

@LarsWirzenius의 의견에 비추어이 질문에 대해 분명히 말씀해 주시겠습니까? 감사!
Caleb

@ Caleb : 나는 도구를 모르는 / proc을 읽고 프로세스를 죽이고 싶었다. 또한 현재 시스템에서 "kill", "pkill", "skill"등을 사용할 수 없다는 것을 알았습니다. 이 경우 / proc을 읽고 한 명의 사용자가 프로세스를 얻는 방법을 알아 내기 위해 쉘 스크립트 대안을 찾아야한다고 생각합니다. 어떤 아이디어?
user489152

1
“모든 UID의 정적 목록…… 따라서이 사용자가 존재하는지 확인할 수 있습니다”와 관련하여 : 사용자 ID를 확인하는 것과 같은 것은 없습니다. 사용자 이름은 데이터베이스에서 가져 오지만 사용자 ID는 실행중인 프로세스가 setuid()선택하는 모든 것입니다.
Gilles 'SO- 악마 그만해'

답변:


52

UID 대신 pkill -U UID또는 pkill -u UID또는 username을 사용하십시오 . 때때로 skill -u USERNAME작동 할 수도 있습니다. 다른 도구는 killall -u USERNAME입니다.

스킬 은 리눅스에 특화되어 있으며 구식이며, pkill 은 이식성이 뛰어납니다 (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.

기술 매뉴얼 페이지에 따르면 사용자 ID가 아닌 사용자 이름 만 사용할 수 있습니다. http://man7.org/linux/man-pages/man1/skill.1.html

skill, snice ...이 도구는 더 이상 사용되지 않으며 이식 할 수 없습니다. 명령 구문이 잘못 정의되었습니다. 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.

리눅스 / Solaris 스타일 / proc (procfs)에서 프로세스를 찾는 데 사용되는 모든 유틸리티는 프로세스의 전체 목록을 사용합니다 (일부 readdir 수행 /proc). 나는 그들이 /proc디지털 하위 폴더 를 반복하고 발견 된 모든 프로세스가 일치하는지 검사 할 것이라고 생각 합니다.

사용자 목록을 얻으려면를 사용하십시오 getpwent(통화 당 한 명의 사용자를 얻습니다).

기술 (procps & procps-ng) 및 killall (psmisc) 도구는 모두 getpwnam라이브러리 호출을 사용 하여 -u옵션 인수를 구문 분석 하며 사용자 이름 만 구문 분석합니다. pkill(procps & procps-ng) 는 atol과 getpwnam사용 하여 구문 분석 -u/ -U인수하고 숫자 및 텍스트 사용자 지정자를 모두 허용합니다.


1
pkill은 더 이상 사용되지 않습니다. Linux 외부에서는 이식 할 수 없지만 Linux에 대한 문제는 구체적으로입니다.

1
사용자 목록을 얻으려면 하나의 라이너를 사용하십시오. getent passwd | awk -F : '{print $ 1}'
Petesh

C system () 호출에서 "kill -ju UID"와 같은 명령을 내면 어떻습니까?

1
임베디드 리눅스인가? 당신은 기술, pkill 및 killall이 없습니까? busybox 임베디드 쉘조차 pkill과 killall을 가지고 있습니다.
osgx

2
killall -u USERNAME매력처럼 일했다
michalzuber

8

프로세스 ID 인수로 -1을 kill쉘 명령 또는 killC 함수 에 전달하면 도달 할 수있는 모든 프로세스로 신호가 전송됩니다. 실제로 kill명령 또는 syscall을 실행하는 사용자의 모든 프로세스를 의미합니다 .

su -c 'kill -TERM -1' bob

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

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

5

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

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

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


또는 그냥 pkill -U username.
osgx


0

이것은 나를 위해 잘 작동했습니다. 사용자 이름으로 프로세스의 모든 pid를 찾을 수 있습니다 ps U <username>. 이 시도:

ps U <username> | cut -d " " -f 1 | xargs kill
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.