15 posts tagged “server”
각각의 프로세스들에 우선 순위를 부여하여 프로세스를 관리하고자 할 때 이용
[서식]
nice [-n 조정수치] [–adjustment=조정수치] [변수]
[주요사용 옵션]
-n adjustment,
-adjustment, : 명령의 우선권에 10 대선 조정 수치를 더한다.
–adjustment=adjustment
-h : 도움말
-v : 버전 정보
[사용법]
기본적으로 아무런 옵션 없이 nice를 사용하면 상속 받은 현재 순서의 우선권을 출력한다.
옵션으로 조정 수치를 줄 때, 이 값의 범위는 ?20~19 까지 이다.
수치가 작을수록 높은 우선 순위를 갖게 된다.
[서식]
kill [-옵션] pid
kill [-옵션] 시그널
[주요 사용 옵션]
-s 시그널 : 특별히 보낼 시그널 지정
-p : 실행중인 프로그램의 이름만을 출력
-l 시그널 : 시그널로 사용할 수 있는 시그널 이름들을 출력. 이것은 /usr/include/linux/signal.h 에서 볼 수 있음.
[사용법]
ps로 실행 중인 프로그램의 id 확인. kill로 실행 중인 프로그램 중단.
강제로 실행 중인 프로그램을 종료 시킬 때에는 옵션으로 ?9, -SIGKILL, -KILL 등은 사용하면 된다.
자주 사용되는 시그널의 의미
- SIGUP : hangup, 로그아웃 하거나 접속을 끊을 때 발생하는 시그널, 특정의 실행중인 프로그램이 이용하는 설정 파일을 변경시키고 변화된 내용을 적용할때 이용
- SIGINT : interrupt, 현재 작동 중인 프로그램의 동작을 멈출 때 사용
- SIGQUIT : quit, SIGINT와 마찬가지로 종료 키를 누를 때 커널에 의해 보내지는데 일반적인 값은 ^c. SIGQUIT는 비정상적인 종료이므로 코어파일을 생성하고 종료한다는 것이 차이이다.
- SIGKILL : kill, 무조건 해당 실행 중인 프로그램을 중지.
- SIGSEGV : segmentation violation, 메모리 액세스가 잘못 되었을 때 발생
- SIGTERM : terminate, 실행중인 프로그램에 정의되어 있는 정상적인 종료방법으로 프로그램을 끝내게 한다. Kill 명령에서 시그널을 특별히 지정하지 않으면 이 시그널을 이용하여 프로그램을 끝낸다.
프로세스라는 것은 현재 실행되고 있는 프로그램들을 가리키는 말
[서식]
ps [-옵션]
[주요 사용 옵션]
- -a : 모든 프로세스를 나열
- -c : 해당 프로세스를 유발시킨 명령어 이름을 task struct에 참조한다.
- -e : 해당 프로세스에 관련된 환경변수 정보를 함께 출력
- -f : 프로세스 간 상속관계를 트리 구조를 보여줌
- -h : 메뉴는 보여주지 않음. (PID, TTY, STAT, TIME, COMMAND 등)
- -j : 작업에 관련된 ID를 출력
- -l : j보다 자세하게 정보를 출력
- -u : 사용자 이름과 프로세스가 시작된 시간을 출력
- -x : 터미널에 종속되지 않는 프로세스들을 출력
- -n : 사용자 정보를 ID와 숫자로 표시
- -w : 출력 결과를 생략하지 않고 출력
ps + 옵션 결과가 출력될 때에 윗 부분에 나타나는 메뉴들의 뜻은 다음과 같다
- PID(Process ID) : 프로세스마다 주어지는 번호
- TTY(Tele TYpewrite) : 명령어가 실행되는 터미널의 번호
- STAT(STATe) : 실행되고 있는 프로세스 상태 (R, S, D, T, Z, W, N)
- START(START) : 프로세스가 시작된 시간
- TIME(TIME) : CPU가 사용한 시간
- USER(USER) : 사용자의 이름
- COMMAND(COMMAND) : 사용자가 실행한 명령어
- UID(User ID) : 사용자의 ID
- PGID(Parent Group ID) : 사용자 부모 프로세스의 그룹 ID
- SID(Session ID) : 세션 ID
- PRI(PRIority) : 실행하는 우선 순위에 따른 프로세스
- NI(Nice) : nice에 의한 우선 순위에 따른 프로세스
- RSS(Resident Set Size) : 프로세스가 사용하는 메모리의 크기
- SZ(SiZe) : 프로세스가 사용하는 자료와 스택의 크기
- SHRD(ShaReD) : 프로세스가 사용하는 공유 메모리
- %CPU : 프로세스가 사용하는 CPU 점유율
- %MEM : 프로세스가 사용하고 있는 메모리 점유율
- WCHAN : 프로세스가 실행하고 있는 커널 루틴
시스템에서 돌아가고 있는 프로세스들은 서로 연관성을 갖고 실행된다.
프로세스들 간의 연결 구조를 트리 형식으로 출력
[서식]
pstree [-옵션] [프로세스 ID | 사용자]
[주요 사용 옵션]
-a : 명령어에 인수를 넣어 실행했다면 명령어 인수까지 함께 보여준다
-c : 독립적인 하위 트리를 보여주지 않는다. 같은 위치에 같은 프로세스가 있을 때는 합치지 않음.
-h : 현재 프로세스와 부모 프로세스를 좀 더 두드러지게 출력
-l : 특별한 긴 줄이 있어도 그대로 보여줌
-n : PID 순서대로 정렬해서, 같은 부모 프로세스를 가진 자식 프로세스들끼리 모아 출력
-p : PID도 출력
-u : UID도 출력
-G : 프로세스 간의 관계를 보기 좋게 출력
-V : 버전 정보
이 기능으로 하나 이상의 작업을 console에서 사용할 수 있다.
Foreground : 화면에 보여주면서 실행되는 상태(입력을 받아들인다.)
Background : 화면에 보여주지 않으면서 실행되는 상태(입력을 받지 못한다)
Suspend : 메모리에 올라가 있지만 정지된 상태
Foreground로 실행하기
일반적으로 사용하는 방법이 foreground로 실행되는 것이다.
Background로 실행하기
뒤에 &를 붙이면 화면 뒤에서 실행이 된다.
이렇게 실행하면 다른 작업을 동시에 할 수 있지만
vi와 같이 입력을 받아 실행하는 프로그램은 background로 실행될 수 없다.
Foreground를 suspend로 실행하기
^Z을 누르면 실행 중이던 프로그램이 suspend된다.
Suspend된 것을 다시 foreground로 하기 위해서는 fg %<작업번호>를 사용한다.
작업번호는 jobs 명령어로 알 수 있다.
Suspend된 것을 다시 background로 하기 위해서는 bg %<작업번호> 를 사용한다.
프로세스 간의 통신 수단이 signal 이라고 할 수 있다.
하나의 프로세스가 다른 프로세스에게로 메시지를 보내기 위한 수단이다.
kill은 프로세스를 죽이는 명령이 아니라 signal 을 보내는 명령이다.
signal
일반적으로 사용되는 signal은 다음과 같다.
이름 번호 의미
HVP 1 Hangup (실행종료. 로그아웃 하거나 모뎀 접속을 끊을 때 보냄)
INT 2 Interrupt (실행종료. ^c를 쳤을 때 보내진다.)
QUIT 3 Quit (실행종료. ^8를 쳤을 때 보내진다.)
KILL 9 Kill (무조건 종료)
SEGV 11 Segmentation Violation (허가되지 않은 메모리 영역에 접근)
TERM 15 Terminate (가능한 한 정상 종료)
CONT 18 Continue (STOP나 TSTP에 의해 정지된 프로세스가 다시 실행을 계속한다.)
STOP 19 Stop (무조건적으로 그리고 즉각적으로 정지)
TSTP 20 Stop (실행을 정지 후 다시 실행을 계속하기 위해 대기. ^Z)
kill 명령의 사용법
kill <pid>
kill -<signal> <pid>
현재 존재하는 프로세스들의 실행 상태를 요약한 보고서를 만들어 준다.
ps 명령어를 파이프와 함께 사용하는 것이 유용할 때가 있다. 보통 다음과 같이 사용함으로써 httpd process가 실행 중인지 확인할 수 있다.
ps aux | grep http [return]
PS 상태에 대한 여러 가지 정보는 다음과 같다
- user(BSD) : 프로세스 소유자의 username
- uid(sysV) : 프로세스 소유자의 username
- pid : 프로세스 식별번호
- %CPU : cpu 사용 비율 추정치 (BSD)
- %mem : 메모리 사용 비율 추정치 (BSD)
- SZ : K 단위 혹은 페이지 단위의 가상 메모리 사용 가능
- RSS: 실제 메모리 사용량
- TTY : 프로세스와 연결된 터미널 포트
- STAT : 프로세스의 현재 상태
- R : 실행 중 혹은 실행될 수 있는 상태
- S : sleep
- I : idle (비활동 상태 : BSD / 중간적 상태 : sysV)
- T : 정지된 상태 (suspend)
- Z : 좀비 (zombie) 프로세스
- D : 디스크 관련 대기 상태 (BSD)
- P : 페이지 관련 대기 상태 (BSD)
- X : 메모리 확보를 위해 대기 중 (sys V)
- K : 사용 가능한 커널 프로세스 (aix)
- W : 스왑 out된 상태
- N : nice 되어진 상태
- > : 우선 순위가 인위적으로 높아진 상태
- TIME : 총 cpu 사용 시간
- COMMAND: 프로세스의 실행 명령 행
- STIME(sysV) : 프로세스가 시작된 시각 혹은 날짜
- C(sysV)/CP(BSD) : 짧은 기간 동안의 cpu 사용률
- F : 프로세스의 프래그들
- PPID : 부모 프로세스의 PID
- PRI : 실제 실행 우선 순위
- NI : nice
- WCHAN : 프로세스를 기다리고 있는 이벤트
top (CPU 프로세스 상황 보여주기)
top 시스템의 프로세스 수가 얼마이고 몇 개의 프로세스가 돌아가고 있고 어떤 사용자와 데몬들이 있는지, CPU 상태는 어떤지 등에 대한 정보를 실시간으로 보여준다.
| space | 변환된 값을 보여준다. |
| ^L | 화면을 clear한 후에 새로 출력 |
| f | 출력된 정보를 추가적으로 더 선택한다 |
| h / ? | top 에서 사용할 수 있는 명령어와 그에 대한 설명을 출력 |
| k | 지정한 프로세스에 시그널을 보내 프로세스를 끝낼 수 있게 한다. |
| l | 평균 시스템 부하를 보여주는 기능으로 전환 |
| m | 메모리 정보를 보여주는 기능으로 전환 |
| n / # | 보여주는 프로세스의 개수를 지정 |
| q | top을 종료 |
| r | 지정한 프로세스의 nice값을 재조정 |
| s | 몇 초마다 정보를 갱신할 것인지 결정한다. |
| t | 합계 정보를 보여주는 기능으로 전환 |
| k | 지정한 프로세스에 시그널을 보내 프로세스를 끝낼 수 있게 한다. |
| C | 명령어의 전체 경로를 보여주는 기능으로 전환 |
| I | 유휴 프로세스 (idle process)를 보여주는 기능으로 전환 |
| P | CPU 사용률에 따라 정렬 |
| M | 상주 메모리 (resident memory)에 따라 정렬 |
| S | 실행이 끝난 프로세스의 CPU 시간까지 포함하여 프로세스가 점유한 총 CPU 시간을 표시 |
| T | 현재 CPU 타임 대 누적 CPU 타임 비율로 정렬 |
| W | 현재 설정을 ~/.toprc 파일에 저장하여 다음 번 실행할 때 현재 설정된 대로 실행되게 함 |
좀비 프로세스(Zombie process)의 정의
실행이 종료되었지만 아직 삭제되지 않은 프로세스를 말한다.
process는 죽었는데 자원을 차지하고 있는 것(전염성이 있음).
좀비프로세스는 시스템에 좋지 않은영향을 줌과 동시에, 심리적인 타격을 줌으로 좀비프로세스는 생기지 않도록 하는게 중요하다.
좀비 프로세스(Zombie process)의 발생원인
좀비프로세스가 발생하는 상황은 자식프로세스가 종료되었는데, 아직 부모프로세스가 종료되지 않았거나, 부모프로세스가 wait()계열 함수를 호출해서 자식프로세스를 정리하지 않았을 경우 발생한다.
좀비 프로세스(Zombie process)의 처리
보통 특정 프로세스를 종료시키기 위해서 우리는 kill 시스템명령어를 이용해서 해당 프로세스의 PID로 시그널을 보내며, 프로세스가 시그널에 반응하지 않을경우 -9 (SIGKILL)을 보내서 강제적으로 종료한다.
그러나 좀비프로세스의 경우 이러한 시그널을 보낸다고 하더라도 종료되지 않는다.
좀비프로세스는 실제 존재하지 않는 이미 종료된 프로세스임으로 종료된 프로세스에 종료시그널을 보낸다고 해서 여기에 반응하지는 않는다.
좀비프로세스를 막는 일반적인 방법으로는 wait()함수를 부모에서 호출하는 것이다.
wait 함수는 자식프로세스가 종료될때까지 현재 프로세스를 블럭킹 시키며, 자식이 종료되거나 시그널(주로 SIGCHLD)이 발생해서 시그널핸들러를 호출할때 return 된다.
만일 wait 를 호출하기 전에 자식프로세스가 이미 종료 되어서 좀비상태로 기다리고 있다면, 함수는 즉시 리턴한다. 리턴하면서 함수는 프로세스의 상태값을 얻어오고, task 구조체에서 해당 프로세스의 정보를 완전히 삭제한다.
wait 함수의 사용방법은?
…