KOROMOON

착한 사마리아인이 되고 싶습니다.

2/13/2020

시그널(Signal), kill 명령어, killall 명령어


( 1 ) 시그널(Signal)

kill, killall 명령어와 시그널은 밀접한 관계가 있으므로 시그널에 대해 알 필요가 있음.
시그널이란 프로세스에게 어떤 이벤트의 발생을 알리기 위해 전달되는 소프트웨어 인터럽트임.
유닉스/리눅스 운영체제는 매우 다양한 종류의 시그널이 있으며 이러한 시그널은 각각의 의미를 가지고 사용됨.

시그널을 일으키는 이벤트는 아래와 같음.
1. Hardware Exception (나누기 0 등)
2. Software Condition (Alarm 시간, Expire 등)
3. 단말기에서 발생하는 사용자 입력 (^C, ^Z 등)
4. kill 등과 같은 시스템 콜

시그널 종류
번호
시그널 이름
발생 및 용도
디폴트 action
1
SIGHUP(HUP)
연결끊기 (프로세스의 설정파일을 다시 읽는데 사용됨)
실행종료 (로그아웃하거나 모뎀 접속을 끊을 때 보내짐)
종료
2
SIGINT(INT)
인터럽트 (실행종료, CTRL+C 를 입력할 때 보내짐)
종료
3
SIGQUIT(QUIT)
Quit (실행종료, CTRL+/ 를 입력할 때 보내짐)
종료
(코어덤프)
4
SIGILL(ILL)
잘못된 명령
5
SIGTRAP(TRAP)
트렙 추적
6
SIGIOT(IOT)
IOT 명령
7
SIGBUS(BUS)
버스 에러
8
SIGFPE(FPE)
부동 소수점 에러
종료
9
SIGKILL(KILL)
무조건적으로 즉시 중지함.
이 시그널은 잡히지 않음.
종료
10
SIGUSR1(USR1)
사용자 정의 시그널1
종료
11
SIGSEGV(SEGV)
세그멘테이션 위반 (허가되지 않은 메모리 영역 접근)
12
SIGUSR2(USR2)
사용자 정의 시그널2
종료
13
SIGPIPE(PIPE)
읽을 것이 없는 파이프에 대한 시그널
(읽으려는 프로세스가 없는데 파이프에 쓰려고 함)
종료
14
SIGALRM(ALRM)
경보(Alarm) 시그널
(Alarm(n)에 의해 n초 후 생성됨)
종료
15
SIGTERM(TERM)
소프트웨어 종료 시그널
(일반적으로 kill 시그널이 전송되기 전에 전송됨.
잡히는 시그널이기 때문에 종료되는 것을 트랙할 수 있음.)
종료
16
SIGTKFLT
코프로세서 스택 실패
17
SIGCHLD(CHLD)
프로세스 종료 시 그 부모 프로세스에게 보내지는 시그널
무시
18
SIGCONT(CONT)
Continue
(STOP 이나 TSTP 에 의해 정지된 프로세스가 다시 실행을 계속함)
19
SIGSTOP(STOP)
정지 시그널
(SIGSTP 와 같으나 잡거나 무시할 수 없음.
무조건으로 즉각적으로 정지함.)
프로세스 정지
20
SIGTSTP(TSTP)
키보드에 의해 발생하는 시그널로 Ctrl+Z로 생성됨.
실행을 정지 후 다시 실행을 계속하기 위하여 대기함.
(터미널 정지 문자)
프로세스 정지
21
SIGTTIN
백그라운드에서의 제어터미널 읽기
프로세스 정지
22
SIGTTOU
백그라운드에서의 제어터미널 쓰기
프로세스 정지
23
SIGURG
소켓에서의 긴급한 상태
24
SIGXCPU
CPU 시간 제한 초과. setrlimit(2) 메뉴얼 패이지 참조
25
SIGXFSZ
파일 크기제한 초과. setrlimit(2) 메뉴얼 패이지 참조
26
SIGVTALRM
가상 시간 경고. setitimer(2) 메뉴얼 패이지 참조
27
SIGPROF
프로파일링 타이머 경고. setitimer(2) 메뉴얼 페이지 참조
28
SIGWINCH
윈도우 사이즈 변경
29
SIGIO
기술자에서 입출력이 가능함. fcntl(2) 메뉴얼 참조
30
SIGPWR
전원 실패
31
UNUSED
사용 안함



( 2 ) kill 명령어

kill 명령어는 지정한 프로세스에 지정한 시그널을 보냄.
시스템에 문제가 생겨 해당 프로세스를 터미널에서 종료시킬 경우 유용함.
만약 kill 명령으로 종료되지 않는 프로세스가 있다면 -9 옵션을 이용하여 프로세스를 강제 종료시킴.
보통 ps 명령어를 이용해서 종료시킬 프로세스 정보를 확인함.

사용예 )
ps 명령어로 확인된 프로세스 정보를 확인함.
PID 값이 1945 라면 아래와 같이 입력해서 종료시킴.
kill 1945
만일 kill 명령으로 종료되지 않는다면 -9 옵션을 이용해서 강제 종료시킴.
kill -9 1945
kill -HUP PID 명령어를 이용하면 종료된 프로세스가 다시 되살림.
kill -HUP 1945


kill 옵션은 아래와 같음.
-l : 시그널 리스트를 나열함. 시그널 번호와 시그널 이름은 매치되어서 보여줌.
-s : 특별히 보낼 시그널을 지정함. 시그널 번호나 시그널 이름을 지정함.
-숫자 : -l 옵션을 입력하여 보여진 시그널 리스트에서 시그널 숫자와 매치되는 시그널을 지정함. 보통 -1(-HUP, 프로세스 재활성화) 와 -9(-KILL, 프로세스 강제 종료) 를 많이 쓰임.



( 3 ) killall 명령어


killall 명령어는 프로세스 번호가 아닌 이름으로 프로세스를 종료시키는 명령어임.

기본형식 : killall [OPTION]... [--] NAME...
          killall -l, --list
          killall -V, --version

  -e,--exact          매무 긴 이름에 대한 정밀한 일치 요구
  -I,--ignore-case    대소문자 구분없이 프로세스 이름 일치
  -g,--process-group  프로세스를 대신해서 프로세스 그룹 종료
  -y,--younger-than   지정된 시간보다 이전 프로세스 종료
  -o,--older-than     지정된 시간보다 이후 프로세스 종료
  -i,--interactive    종료 전에 확인 요구
  -l,--list           모든 알려진 시그널 이름 나열
  -q,--quiet          don't print complaints
  -r,--regexp         확장된 정규 표현식으로 이름 해석
  -s,--signal SIGNAL  SIGTERM 대신 해당 시그널로 전송
  -u,--user USER      해당 사용자로 실행된 프로세스만 종료
  -v,--verbose        시그널이 성공적으로 전송될 경우 보고
  -V,--version        버전 정보 출력
  -w,--wait           프로세스가 종료될 때까지 대기



( 4 ) ps 와 kill 명령어 조합으로 여러 프로세스 종료

종료시킬 프로세스 리스트를 나열함.
ps ax | grep httpd

해당 프로세스들의 PID 만 모음.
ps ax | grep httpd | awk '{print $1}'

PID 하나씩 kill 명령어에 매개변수로 넘겨서 다 종료시킴.
ps ax | grep httpd | awk '{print $1}' | xargs kill

또는 아래와 같이 사용 가능함.
kill -9 `ps -ef | grep httpd | grep -v grep | awk '{print $2}'`



( 5 ) killall 명령어 사용으로 여러 프로세스 종료

아래와 같이 killall 명령어 이용해서 종료시킬 프로세스 이름 지정함.
killall httpd



ps.
만일 kill -9 1 명령어를 입력하면 시스템이 다운됨.
PID 가 1 은 init 임.



============================================================
본 게시물은 KOROMOON 님께서 작성하였으며 CCL (Creative Commons License) 에서 "저작자표시-비영리-동일조건변경허락" 이용조건으로 자료를 이용하셔야 합니다.

댓글 없음:

댓글 쓰기