6. kill(프로세스 종료) |
1) 경로 : /bin/kill
2) 요약 : 프로세스 종료
3) 사용 방법
kill [-s 시그널] [-a] pid ...
kill -l(엘) [시그널]
<시그널>
시그널(Signal)은 유닉스 시스템에서 프로세스간 통신을 하는 가장 오래된 방법으로 프로세스에 비동기적인 이벤트를 전달하는데 사용합니다. 이와 같은 시그널은 키보드 인터럽트나 에러 상황이 일어났을 때 발생합니다. 또한 쉘이 자식 프로세스에 작업 명령을 보낼 때에도 사용하빈다. 이러한 시그널의 목록은 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 |
30) SIGRTMIN+1 | 31) 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 |
프로세스는 대부분의 시그널을 무시할 수 있지만, 9번(SIGKILL)과 19번(SIGSTOP) 시그널은 무시할 수 없습니다. 앞서 kill을 설명할 때 뒤따라 붙던 숫자가 바로 이 시그널 번호입니다. 프로세스가 시그널을 받으면 이 시그널을 블록할 수도 있으며 직접적으로 처리하거나 커널에 제어권을 넘길 수도 있습니다. 커널에 넘어가면 이 시그널이 동작대로 움직입니다.
리눅스 프로세스의 task_struct 정보를 참조하여 시그널을 구현합니다. 시그널의 개수는 시스템마다 다를 수 있습니다. 시스템에서 지원하는 시그널의 최대 수는 프로세서(CPU)의 워드 크기에 제한을 받기 때문입니다. 예를 들어 64비트 워드를 사용하는 시스템에서는 시그널을 64개까지사용할 수 있습니다. 처리 대기중인 시그널은 signal 항목에, 블록된 항목은 blocked 항목에 들어갑니다. 블록된 시그널은 이 블록을 해제할 때까지 대기 상태로 남습니다.
4) 옵션
pid ... : 종료 시킬 프로세스 ID나 프로세스 이름을 지정
-s : 전달할 시그널의 종류를 지정. 시그널 이름이나 번호를 써줌
-l(엘) : 시그널로 사용할 수 있는 이름들을 출력. /usr/include/linux/signal.h 파일에서도 알 수 있음
-1 : -HUP 프로세스를 재활성화
-9 : 프로세스를 강제로 종료
5) 추가 설명
kill 명령어는 프로세스에 종료 시그널을 보냅니다. 시스템에 얘기치 않은 문제가 생긴 프로세스를 종료 시킬 수 있습니다. 만일 kill 명령으로 종료되지 않은 프로세스는 -9 옵션을 사용해서 강제로 종료하면 됩니다.
아래와 같이 ps 명령어로 sshd 프로세스를 확인할 수 있습니다.
# ps aux | grep sshd
root 2518 0.0 0.1 7084 1076 ? Ss Jun07 0:00 /usr/sbin/sshd
root 12095 0.0 0.3 9936 2812 ? Ss 02:34 0:00 sshd: chan [priv]
chan 12097 0.0 0.2 9936 1604 ? S 02:34 0:00 sshd: chan@pts/1
root 12216 0.0 0.0 3932 684 pts/1 R+ 02:46 0:00 grep sshd
현재 sshd 프로세스는 root 사용자 권한으로 동작하고 있으며 PID는 2518과 12095입니다. 참고로 ps aux 명령에서 볼 수 있는 프로세스 정보에 대한 각각의 필드 내용은 다음과 같습니다.
Root | USER | 프로세스의 사용자 |
2518 | PID | 프로세스 ID |
0.0 | %CPU | 마지막1분 동안 프로세스가 사용한 CPU 점유율 |
0.1 | %MEM | 마지막 1분 동안 프로세스가 사용한 메모리의 점유율 |
7084 | VSZ | 가상 메모리에 있는 프로세스 크기(KB 단위) |
1076 | RSS | 프로세스의 실제 메모리의 크기(KB 단위) |
? | TTY | 연결되어 있는 터미널 |
Ss | STAT | 실행되고 있는 프로세스 상태 |
Jun07 | START | 프로세스가 시작된 날자 |
0:00 | TIME | 프로세스가 소비한 총 시간 |
/usr/sbin/sshd | COMMAND | 사용자가 실행한 명령 이름 |
ps 명령으로 확인한 PID를 이용하면 워하는 프로세스를 종료 시킬 수 있습니다.
# kill 2518
만일 kill 명령으로 종료되지 않으면 -9 옵션으로 강제 종료해 봅니다.
# kill -9 2518
kill -HUP pid 명령을 이용하면 프로세스를 종료 후 다시 재실행 합니다.
# kill -HUP 2518
7. killall(프로세스 종료) |
1) 경로 : /usr/bin/killall
2) 요약 : 프로세스 이름으로 프로세스를 종료
3) 사용 방법
killall [-egiqvw] [-시그널] 이름...
killall -l(엘)
killall -V
4) 옵션
-e : 종료하려는 프로세스 이름이 매우 긴 경우 사용. killall은 15 글자가 넘어가면 그 이후의 단어는 무시하고 앞에 15 글자가 같은 프로세스 모두 종료. 아주 긴 이름을 갖는 프로세스에 유용
-g : 그룹을 지정하여 프로세스를 종료. 같은 프로세스 그룹에 속한 여러 프로세스가 발견되더라도 시그널은 그룹별로 한 번만 보내짐
-i : 프로세스 종료 전 확인 메시지를 출력
-l(엘) : 알려진 모든 시그널 이름을 출력
-q : 어떤 메시지도 출력하지 않음
-v : 시그널을 제대로 보낸 경우, 상세한 정보를 출력
-V : 버전 정보 출력
-w : 프로세스가 종료될 때까지 대기
5) 추가 설명
killall 명령어는 kill 명령어와 달리 프로세스 이름을 사용하여 프로세스를 종료할 수 있습니다. 아래와 같이 httpd 데몬을 확인해 봅니다.
# ps aux | grep httpd
root 12295 7.0 1.1 22572 9392 ? Ss 03:06 0:00 /usr/sbin/httpd
apache 12297 0.0 0.6 22572 4792 ? S 03:06 0:00 /usr/sbin/httpd
apache 12298 0.0 0.6 22572 4792 ? S 03:06 0:00 /usr/sbin/httpd
apache 12299 0.0 0.6 22572 4792 ? S 03:06 0:00 /usr/sbin/httpd
apache 12300 0.5 0.6 22572 4792 ? S 03:06 0:00 /usr/sbin/httpd
apache 12301 0.0 0.6 22572 4792 ? S 03:06 0:00 /usr/sbin/httpd
apache 12302 0.0 0.6 22572 4792 ? S 03:06 0:00 /usr/sbin/httpd
apache 12303 0.0 0.6 22572 4792 ? S 03:06 0:00 /usr/sbin/httpd
apache 12304 0.0 0.6 22572 4792 ? S 03:06 0:00 /usr/sbin/httpd
root 12306 0.0 0.0 3932 684 pts/1 R+ 03:0 0:00 grep httpd
killall 뒤에 프로세스 이름인 httpd를 입력하여 해당 데몬을 모두 종료할 수 있습니다.
# killall httpd
# ps aux | grep httpd
root 12311 0.0 0.0 3932 684 pts/1 R+ 03:08 0:00 grep httpd
같은 이름으로 여러 프로세스가 존재할 때는 프로세스 번ㄴ호가 가장 빠른 프로세스를 종료 시키면 나머지 같은 이름의 모든 프로세스도 자동으로 종료됩니다.
chan 이라는 사용자가 이용 중인 프로세스를 검색해 봅니다.
# ps aux | grep chan
root 12545 0.1 0.3 9936 2808 ? Ss 03:31 0:00 sshd: chan [priv]
chan 12547 0.0 0.2 10092 1620 ? S 03:21 0:00 sshd: chan@pts/2
chan 12548 0.0 0.1 4556 1424 pts/2 Ss 03:21 0:00 -bash
chan 12572 0.0 0.1 2348 1048 pts/2 S+ 03:22 0:00 top
root 12574 0.0 0.0 3932 684 pts/1 R+ 03:22 0:00 grep chan
killall -u 명령으로 chan 사용자가 이용 중인 모든 프로세스를 종료할 수 있습니다.
# killall -u chan
# ps aux | grep chan
root 12582 0.0 0.0 3932 688 pts/1 R+ 03:24 0:00 grep chan
위 명령어를 사용하면 의심스런 특정 사용자의 프로세스는 물론 시스템 접속까지 한꺼번에 종료시킬 수 있습니다.
8. lockfile(세마포어 파일 생성기) |
1) 경로 : /usr/bin/lockfile
2) 요약 : procmail에서 접근 제어 파일을 생성
3) 사용 방법 : lockfile [옵션] 파일명
4) 옵션
-sleeptime : 락 파일(lockfile) 생성이 실패한 후에 재시도까지 시간(sleeptime)을 지정. 기본값은 8초
-r retries : 파일을 생성하는 재시도 횟수를 지정. 기본값은 -1로 파일 생성이 성공할 때까지 시도
-l(엘) locktimeout : 락 파일이 수정/생성된 시점에서 일정한 시간(locktime) 후에 락 파일을 강제로 삭제
-s suspend_time : 대기시간(supend_time) 후에 락 파일을 삭제. 기본값은 16초
-! : 결과값의 역. 주로 쉘 스크립트에서 사용
-ml, -mu : 메일 스풀 디렉터리 퍼미션에 제한이 없으면 시스템의 메일 박스를 락(-ml) 또는 언락(-mu) 할 수 있습니다.
5) 추가 설명
lockfile 명령어는 procmail 패키지 중 하나로 특정 파일이나 디바이스, 리소스에 대한 접근 제어를 담당하는 세마포어의 잠금 파일을 생성합니다. 이 잠금 파일은 특정 파일, 디바이스, 리소스를 특정한 프로세스가 사용하느 있다는 일종의 상태 플래그를 생성하여 다른 프로세스에서 접근하지 못하도록 합니다. 잠금 파일은 보통 /var/lock 디렉터리에 위치합니다.
<세마포어>
세마포어(semaphores)는 운영체제의 자원을 경재적으로 사용하는 다중 프로세스에서 행동을 저정하거나 또는 동기화시키는 기술입니다. 세마포어는 운영체제 또는 커널에서 지정한 저장 장치 내부의 값으로서, 각 프로세스는 이를 확인하고 변경할 수 있습니다. 확인되는 세마포어의 값에 따라 프로세스가 즉시 자원을 사용할 수 있습니다. 만일 이미 다른 프로세스가 선점 중이라는 사실을 얻게 되면 재시도하기 전에 일정 시간을 기다려야 합니다.
세마포어는 0 또는 1 값만 갖거나 또는 추가적인 값을 가질 수도 있습니다. 세마포어를 선점한 프로세스만이 값을 변경할 수 있고, 이때 다른 프로세스는 세마포어가 반황되어 자기에 할당될 때까지 대기 상태로 놓이게 됩니다.
세마포어들은 프로세스 간의 통신(IPC)을 위한 기술 중 하나입니다. 세마포어는 일반적으로 메모리 공간을 공유하거나 파일들을 공유 액세스하기 위한 목적으로 사용합니다. C 프로그래밍 언어는 기본적으로 세마포어를 관리하기 위한 일련의 인터페이스 또는 함수들을 제공합니다.
9. lsof(사용중인 파일들의 목록 보기) |
1) 경로 : /usr/sbin/lsof
2) 요약 : 실행중인 파일과 프로세스의 정보를 출력
3) 사용 방법 : lsof [옵션] [파일]
4) 옵션
-a : 파일을 선택하는데 AND 연산으로 대상을 출력
-c : 지정한 COMMAND 필드의 내용만 출력
-F : 지정한 구분자로 필드를 구분하여 출력
-g : 지정한 그룹 아이디를 사용하는 관련 프로세스를 출력
-i : 현재 사용되는 소켓 정보를 출력
-l(엘) ; 로그인 사용자명 대신에 UID를 출력
-n : 호스트명 대신에 IP주소를 출력
-P : 포트 서비스명 대신에 포트 번호를 출력
-r : 지정한 초의 주기로 반복해서 출력. 기본값은 15초
-s : 파일의 크기를 출력
-V : 상세한 정보 출력
-?, -h : 사용법 출력
5) 추가 설명
lsof 명령어는 현재 사용하는 모든 파일의 소유자, 크기, 고나련 프로세스 등의 정보를 자세히 출력합니다.
# lsof
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 rootmem REG 3,5 30748 30330 /sbin/init
init 1 rootmem REG 3,5 73120 8069 /lib/ld-2.1.3.s
init 1 rootmem REG 3,5 931668 8075 /lib/libc-2.1.3.so
cardmgr 213 rootmem REG 3,5 36956 30357 /sbin/cardmgr
... 생략 ...
COMMAND 필드 중 sshd와 관련된 시스템에서 사용하는 파일들을 살펴봅니다.
# lsof -c sshd
COMMAND USER FD TYPE DEVICE SIZE NODE NAME
sshd 799 root cwd DiR 3,8 409 2 /
sshd 799 root rtd DIR 3,8 4096 2 /
sshd 799 root txt REG 3,8 258028 343237 /usr/sbin/sshd
sshd 799 root mem REG 3,8 464005 228056 /lib/ld-2.2.4.so
... 생략 ...
-i 옵션을 사용하여 현재 열려있는 소켓 정보를 살펴볼 수 있습니다. TCP와 UDP를 각각 지정하여 볼 수도 있습니다. NAME 필드의 *: 서비스명으로 현재 서비스 대기 상태의 현황을 살펴볼 수 있습니다.
# lsof -iTPC
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 799 root 3u IPv4 1407 TCP *:ssh (LISTEN)
lpd 817 root 6u IPv4 1425 TCP *:printer (LISTEN)
X 1917 root 1u IPV4 12765 TCP *:x11 (LISTEN)
Rdesktop 2607 root 7u IPv4 18494 TCP ns.chan.co.kr.:1530->10.10.10.1:3389 (ESTABLISHED)
xinetd 2691 root 3u IPv4 20721 TCP *:pop3 (LISTEN)
... 생략 ...
sshd 26792 root 4u IPv4 199121 TCP ns.chan.co.kr.:ssh->10.10.10.2:1031 (ESTABLISHED)
10. mkfifo(FIFO 만들기) |
1) 경로 : /usr/bin/mkfifo
2) 요약 : FIFO 파이프를 만듦
3) 사용 방법 : mkfifo [옵션] 파일명
4) 옵션
-m, --mode mode : 퍼미션 비트를 지정한 모드로 설정. chmod 명령어의 기호 형식이나 숫자 형식
-Z, --context=CTX : 각각의 SELinux 보안 컨텍스트 이름을 CTX로 설정
--help : 사용법 출력
--version : 버전 정보 출력
5) 추가 설명
mkfifo명령어는 주어진 이름으로 하나의 FIFO를 만듧니다. 초기값으로 만들어지는 FIFO의 모드는 0666입니다.
프로세스 간 통신을 위해 FIFO가 사용됩니다.
'IT 이야기 > Linux 명령어' 카테고리의 다른 글
[RHEL6] 프로세스 관리 명령어 4탄(pmap, ps, pstree, renice) (0) | 2020.05.13 |
---|---|
[RHEL6] 프로세스 관리 명령어 3탄(mkfs, nice, nohup, pidof) (0) | 2020.05.12 |
[RHEL6] 프로세스 관리 명령어 1탄(fuser, init, ionice, ipcrm, ipcs) (0) | 2020.05.08 |
[RHEL6] 패키지 관리 명령어 3탄(rpm, rpm2cpio, rpmbuild, yum) (0) | 2020.05.07 |
[RHEL6] 패키지 관리 명령어 2탄(dpkg, pkgadd, pkgchk, pkginfo, pkgrm) (0) | 2020.05.06 |
댓글