목차
1. kill 명령어
[사용 형식]
pid: 프로세스 ID(ps 또는 jobs 명령어를 통해 프로세스 ID를 확인할 수 있습니다.)
1. 시그널을 지정하지 않을 경우 기본 값인 정상 종료(15, SIGTERM) 시그널을 보냅니다.
# kill [pid]
2. 시그널 지정
# kill -s [signal id] [pid]
# kill -s [signal text] [pid]
# kill -[signal id] [pid]
# kill -[signal text] [pid]
• 프로세스에 시그널을 보내 원하는 작업을 하게 하는 명령어
• 일반적으로 프로세스 종료 명령어로 많이 알려져 있는데 -s 옵션으로 시그널을 지정하지 않으면 기본 시그널 값이 정상종료(SIGTERM,15)이기 때문입니다.
• 프로세스를 안전하게 종료하기 위해서는 "kill -9 pid", "kill -SIGKILL pid" 형태로 프로세스 강제 종료를 권장하지 않습니다. (데이터 유실 위험)
• 일반적으로 해당 Process에 문제가 있어서 다시 시작하고자 할 때에는 SIGHUP, SIGTERM, SIGKILL의 순서로 시도해보길 권장됩니다.
• kill 명령어는 내부적으로 kill()이란 시스템 콜을 사용하여 구현하고, 프로세스 식별자(PID)로 지시한 프로세스와 프로세스 그룹 식별자(PGID)로 지시한 프로세스 그룹에 시그널을 보냅니다.
2. 시그널
• 시그널이란 인터럽트의 일종으로 어떤 이벤트의 발생을 프로세스에게 알려주는 것입니다.
• 특정 이벤트가 발생했을 때 프로세스에게 전달하는 신호(메시지)
• 리눅스에서 프로세스끼리 통신할 때 사용합니다.
• 시그널 이벤트로는 HW 예외(나누기 0), SW 상태, 사용자 입력, 시스템 콜(kill) 등이 있습니다.
[리눅스 사용자 입력에 의한 시그널(인터럽트 시그널)]
2.1. 시그널 종류
• kill -l 명령어를 이용해 사용할 수 있는 시그널을 확인할 수 있습니다.
• OS 마다 지원 시그널이 다를 수도 있습니다.
• 시그널은 여러 종류가 있고 각각 번호가 붙어있습니다.
• SIGUSR1과 SIGUSR2 시그널의 용도는 사용자 정의용입니다.
# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
No Name Default Action Description
1 SIGHUP terminate process terminal line hangup
2 SIGINT terminate process interrupt program
3 SIGQUIT create core image quit program
4 SIGILL create core image illegal instruction
5 SIGTRAP create core image trace trap
6 SIGABRT create core image abort program (formerly SIGIOT)
7 SIGEMT create core image emulate instruction executed
8 SIGFPE create core image floating-point exception
9 SIGKILL terminate process kill program
10 SIGBUS create core image bus error
11 SIGSEGV create core image segmentation violation
12 SIGSYS create core image non-existent system call invoked
13 SIGPIPE terminate process write on a pipe with no reader
14 SIGALRM terminate process real-time timer expired
15 SIGTERM terminate process software termination signal
16 SIGURG discard signal urgent condition present on socket
17 SIGSTOP stop process stop (cannot be caught or ignored)
18 SIGTSTP stop process stop signal generated from keyboard
19 SIGCONT discard signal continue after stop
20 SIGCHLD discard signal child status has changed
21 SIGTTIN stop process background read attempted from control terminal
22 SIGTTOU stop process background write attempted to control terminal
23 SIGIO discard signal I/O is possible on a descriptor (see fcntl(2))
24 SIGXCPU terminate process cpu time limit exceeded (see setrlimit(2))
25 SIGXFSZ terminate process file size limit exceeded (see setrlimit(2))
26 SIGVTALRM terminate process virtual time alarm (see setitimer(2))
27 SIGPROF terminate process profiling timer alarm (see setitimer(2))
28 SIGWINCH discard signal Window size change
29 SIGINFO discard signal status request from keyboard
30 SIGUSR1 terminate process User defined signal 1
31 SIGUSR2 terminate process User defined signal 2
2.2. 시그널 핸들러
• 프로세스가 특정 시그널을 포착했을 때 수행해야 할 별도의 함수(인터럽트 처리 함수)
• 프로그램을 개발할 때 시그널 신호를 받을 경우 특정 동작을 정의하는 함수
• 개발자는 프로그램을 개발할 때 특정 시그널을 수신했을 경우에 실행되기를 바라는 함수 또는 동작(시그널 핸들러)을 정의할 수 있습니다.
• 시그널 핸들러를 특별히 지정하지 않았을 경우 커널에 기본 정의된 액션(TERM, IGN, CORE, STOP, CONT)을 실행합니다.
• 예외적으로, 프로세스는 SIGKILL(9)과 SIGSTOP(19)에 대한 처리를 할 수 없도록 되어있습니다.
• 프로세스를 안전하게 종료하기 위해서는 SIGKILL(9)을 권장하지 않습니다. (해당 프로세스가 시그널 처리 불가능)
2.3. SIGKILL(9) vs SIGTERM(15)
• SIGKILL(9)은 개발자가 프로그램을 개발할 때 핸들링을 할 수 없습니다.
• SIGKILL(9)을 이용해 종료할 경우 개발자가 구현한 종료 함수가 호출되지 않고 즉시 프로세스가 종료되어 데이터가 유실되거나 리소스가 제대로 닫히지 않는 문제가 발생할 수도 있습니다.
• SIGTERM(15)나 SIGINT(2)와 같이 종료를 의미하는 signal을 권장하며 제대로 된 프로그램은 보통 cleanup 코드를 수행하고 종료하게 됩니다.
3. KILL 사용법
[사용 예시]
EX)pid 1
// 시그널을 생략할 경우 기본 시그널 값인 SIGTERM(15)로 적용됩니다.
# kill 1
# kill -s 15 1
// SIGTERM
# kill -s SIGTERM 1
// SIG를 빼고 입력해도 됩니다.
# kill -s TERM 1
// -s옵션을 빼고 -시그널번호, -시그널 형태로 사용할 수도 있습니다.
# kill -15 1
# kill -SIGTERM 1
# kill -TERM 1
3.1. 프로세스 종료
• SIGTERM(15, 정상종료), SIGINT(2, 인터럽트 종료)를 이용합니다.
• 위의 방법으로 종료가 되지 않을 경우 SIGKILL(9, 강제 종료)를 이용해 종료합니다.
1. 테스트를 위해 백그라운드 프로세스 생성
# sleep 50000 &
2. 프로세스 확인
# ps -ef | grep sleep | grep -v grep
root 3267 28331 0 20:25 pts/1 00:00:00 sleep 50000
3. 프로세스 종료
# kill 3267
[1]+ 종료됨 sleep 50000
4. 프로세스 강제종료 (SIGTERM(15) 종료로 안될경우)
# kill -9 3267 (강제종료)
[프로세스 이름을 이용해 종료]
1. 테스트를 위해 백그라운드 프로세스 생성
# sleep 50001 &
[1] 4807
# sleep 50002 &
[2] 4810
# sleep 50003 &
[3] 4812
# sleep 50004 &
[4] 4814
2. 프로세스 확인
# ps -ef | grep sleep | grep -v grep
root 4807 28331 0 20:49 pts/1 00:00:00 sleep 50001
root 4810 28331 0 20:49 pts/1 00:00:00 sleep 50002
root 4812 28331 0 20:49 pts/1 00:00:00 sleep 50003
root 4814 28331 0 20:49 pts/1 00:00:00 sleep 50004
3. 프로세스 이름을 이용해 프로세스 종료
3.1. 백틱 (`)사용
# kill `ps -ef | grep "sleep" | grep -v grep | awk '{print $2}'`
[1] 종료됨 sleep 50001
[2] 종료됨 sleep 50002
[3]- 종료됨 sleep 50003
[4]+ 종료됨 sleep 50004
또는
3.2. -x 옵션 사용
# ps -ef | grep "sleep" | grep -v grep | awk '{print "kill "$2}' | sh -x
3.2. 프로세스 정지 & 재시작
• 정지할 경우에는 SIGTSTP(20) 또는 SIGSTOP(19)를 사용합니다.
(SIGSTOP은 해당 프로세스에서 무시할 수 없습니다.)
• 재시작할 경우에는 SIGCONT(18)를 사용합니다.
1. 테스트를 위해 백그라운드 프로세스 생성
# sleep 50000 &
[1] 8048
2. 프로세스 확인
# ps -ef | grep "sleep 50000" | grep -v grep
root 8048 28331 0 21:41 pts/1 00:00:00 sleep 50000
3. 프로세스 정지
# kill -20 8048
[1]+ Stopped sleep 50000
4. 정지 상태 확인
# jobs
[1]+ Stopped sleep 50000
4. 프로세스 재시작
# kill -18 8048
5. 프로세스 재동작 확인
# jobs -l
[1]+ 8048 Running sleep 50000 &
'OS > Linux' 카테고리의 다른 글
[Linux] 리눅스 ssh 동작 방식, 설치 및 사용법 (0) | 2021.10.06 |
---|---|
[Linux] 리눅스 계정 관련 파일의 필드 정보 ( /etc/passwd ) (0) | 2021.10.05 |
[Linux] 리눅스 파일의 원하는 행과 열 출력 - awk (1) | 2021.09.25 |
[Linux] 리눅스 프로세스 작업 전환 (Background, Foreground) (0) | 2021.09.22 |
[Linux] 서버 상태 확인 스크립트 (0) | 2021.09.21 |