[RHEL6] 프로세스 관리 명령어 2탄(kill, killall, lockfile, lsof, mkfifo)
본문 바로가기
IT 이야기/Linux 명령어

[RHEL6] 프로세스 관리 명령어 2탄(kill, killall, lockfile, lsof, mkfifo)

by 찬찬이 아빠 2020. 5. 12.
반응형
  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가 사용됩니다.

반응형

댓글