HOW TO HACK/Basics

해커라면 알아야 할 리눅스 기초-7 : 프로세스 관리

Mr. Rootable 2016. 4. 14. 14:22

# 본 게시글은 작성자 본인의 스터디 목적으로 작성된 글입니다.


# 본 게시글에는 일부 잘못된 정보가 포함되어있을 수 있습니다.


# 이 글을 열람하는 것은 위 사항에 동의하는 것으로 간주합니다.


# 잘못된 정보에 대한 태클 및 지적질 적극 환영합니다.



지난 포스팅에서는 권한 확인 및 권한 변경에 대해 알아보았다.아래에 링크가 있으니 아직 읽어보지 않았다면 읽어보길 권한다.


해커라면 알아야 할 리눅스 기초-6 : 파일, 디렉토리 권한 조회 및 변경


이번 포스팅에서는 프로세스 관련 명령어 및 사용법을 알아보자.



Step 1 : 현재 실행중인 프로세스 조회


리눅스에서 프로세스를 다루기 위한 명령어는 ps 이다. 이 ps 명령어를 사용하여 현재 시스템에서 실행중인 프로세스 목록을 확인할 수 있다.ps 명령어의 옵션은 다음과 같다.


a : 현재 실행중인 모든 프로세스(다른 사용자들의 프로세스도 포함됨)

e : 프로세스의 실행 환경 출력

u : 프로세스의 사용자 이름/시간

x : 다른 사용자가 실행한 완료되지 않은 프로세스도 출력


다른 옵션들도 많지만 여기서는 이 정도만 살펴보고, 또한 a와 e옵션은 -a, -e 옵션과는 다르다는 것을 짚고 간다. 프로세스 목록을 확인하기 위해 주로 사용하는 옵션은 -aux 와 -ef 이다.

그럼 먼저 아무 옵션도 없이 ps 명령어만 실행해보자.


# ps


bash와 ps명령어만 실행되어있는 것으로 나온다.PID는 프로세스의 아이디이며, TTY는 터미널의 이름이다.

그렇다면, 현재 실행중인 모든 프로세스와 사용자 이름, 시작시간 등을 모두 조회하려면 어떻게 해야 할까?

일반적으로 사용되는 옵션 중 그 첫번째인 -aux 옵션과 함께 ps를 실행해보자.


# ps -aux



스크린샷에서 볼 수 있듯이 USER(사용자이름), PID(프로세스 아이디), STAT(프로세스 상태), START(시작시간), TIME(수행시간), COMMAND(명령이름) 등을 확인할 수 있다.

위에서 말했듯, 프로세스를 확인하는 두번째 일반적인 명령어는 ps -ef 가 있다.


# ps -ef



ps aux와 비교해봤을 때 %CPU와 %MEM 등의 항목이 나오지 않지만, 내 눈에는 -aux 옵션보다깔끔해서 가독성이 좋게 보인다. CPU, Memory 사용율, 프로세스 사용자, 시작시간 모두 필요없으니 걍 간단하게 실행중인 모든 프로세스를 보고 싶으면 -A 옵션을 사용해라. -a(소문자) 옵션을 사용하는 것과는 결과가 다르니 주의하길 바란다.    


# ps -A




Step 2 : 프로세스별 CPU, Memory 상태 동적 확인 (TOP)


top 명령어는 윈도우의 작업관리자와 비슷한 기능을 한다. 즉, 여기서 눈여겨봐야할 글자는 "동적"이다. 

가장 많은 자원을 사용하는 순으로 프로세스 목록 확인이 가능하고,

프로세스의 CPU, Memory 점유율에 따라 실시간으로 그 결과가 변경된다.




Step 3 : 프로세스 종료 (Kill)


현재 실행중인 프로세스를 죽이는 명령어는 kill 이다.

사용법은 아래와 같다.


Usage : kill [옵션] PID


현재 실행중인 프로세스 중 iceweasel(웹브라우저) 프로세스를 종료해보자.



ps -ef 명령어로 확인해보니 iceweasel의 PID는 1705이다. 

아래 명령으로 한번 죽이고 해당 프로세스가 실행중인지 확인해보자.


# kill 1705

# ps -ef | grep iceweasel



아무 결과도 안나온다. 당연히 프로세스가 죽어서 없어졌기 때문이다.

특정 문자열만 추출하기 위한 grep과 명령을 이어줄 파이프라인(|)은 일반적으로 많이 쓰니깐

잘 알아두길 바란다.



Step 4 : 프로세스 우선순위 변경하기 (nice, renice)


모든 프로세스는 우선순위(priority)를 가지고 있다. 스케쥴링 방법 및  우선순위에 따라 프로세스가

실행되게 되어있다. 

리눅스에서 우선순위의 값은 0부터 39까지 있으며, nice값에 따라 우선순위가 정해지는데, 

실행된 모든 프로세스의 기본 nice값은 0이다.

Step 2의 top 명령의 스크린샷을 보면 NI 항목이 있는데, 이 항목의 값이 바로 프로세스의 nice값이며,

거의 모두 0임을 볼 수 있다. 

Kworker/0:+ 어쩌구하는 프로세스는 nice값이 -20이니 우선순위가 최고겠네.. NI항목의 왼쪽에 있는 

PR항목(Priority)이 최고 우선순위인 0이다. 근데 이놈 뭐하는 놈인지 모르겠다 ㅠ.ㅠ


어쨋든, 이 nice값은 최고 -20 에서 최저 19까지 40개가 있다.

조금이라도 눈치가 빠른 사람은 음수인 -20을 최고라고 표현하고, 양수인 19를 최저라고 표현한 이유를

알 수 있을 것이다.

그렇다. 바로 이 nice값이 작으면 작을수록 우선순위는 올라간다.

우리는 이 우선순위를 변경할 수 있는데 이 때 사용되는 명령어는 nice와 renice가 있다.

이 명령어는 당연히 일반사용자는 실행할 수 없다. 

nice 명령어는 초기설정된 작업의 우선순위를 변경할 경우에 사용하며,

renice는 이미 실행되어 있는프로세스의 nice값을 변경할 경우에 사용된다.


nice 명령부터 살펴보자면 nice 명령의 일반적인 사용법은 아래와 같다.


Usage : nice [옵션] [COMMAND] [ARG]


프로세스의 우선순위를 변경할 때 사용되는 방법은 nice [-n 조정수치] [COMMAND] 이다.

실습을 위해 nice 명령어를 통해 top 명령의 우선순위를 -20으로 변경하여 실행해보았다.


# nice -n -20 top



스크린샷을 보면 top 명령의 NI값(nice값)이 -20으로 변경되어 실행되고 있음을 알 수 있다.

(Step 2의 스크린샷을 보면 기본값인 0으로 실행중이다.)


그럼 renice 명령을 통해 앞서 실행한 top 명령의 nice값을 다시 0으로 변경해보자.

renice 명령의 사용법은 아래와 같고, 현재 실행중인 top 명령의 PID값은 2400이다.


Usage : renice 조정수치 PID


아래 명령을 실행해보자.


# renice 0 2400 



PID 2400의 프로세스의 변경 전 priority값과 새로 설정된 priority값을 알려준다.

다시 top 명령이 실행되어있던 터미널 화면에서 확인해보니 아래 스크린샷과 같이

PID 2400의 프로세스의 NI값 (nice값)이 0으로 의도한대로 변경되어있다. 



<끝>