1. 프로세스(Process) 관리 (1) 개요 : 리눅스는 한번에 수백개이상의 프로그램을 동시 수행할 수 있다. 이러한 하나하나의 프로그램을 프로세스라 부르며 내부적으로 번호가 붙어 관리된다. 프로세스는 크게 두 가지로 나눌 수 있는데, 사용자의 입력에 관계없이 실행되는 background process와 입력 후 수행종료까지 기다리는 foreground process가 있다. (2) 프로세스의 종류 1) 포그라운드(Foreground) 프로세스 ㄱ. 설명: 일반적으로 쉘상태에서 명령을 내리면 해당 프로세스가 종료될 때까지 기다려야 한다. 이러한 프로세스를 포그라운드 프로세스라 한다. ㄴ. 사용예 [posein@www posein]$ find / -name '*.txt' 2>/dev/null > list.txt => 이 경우 find 결과가 list.txt라는 파일에 저장할 때까지 사용자는 다른 작업을 할 수 없게 된다. 2) 백그라운드(background) 프로세스 ㄱ. 설명: 기존의 포그라운드 명령뒤에 '&'를 붙인다. ㄴ. 사용예 [posein@www posein]$ find / -type d 2>/dev/null > list.txt & [1] 1742 => 여기서 [1]은 작업번호(job number)이고, 1742는 PID(Process ID)이다. (3) 작업수행의 전환 1) background --> foreground : background로 수행될 때 'fg'라고 명령을 내리면 전환된다. 2) foreground --> background : [CTRL] + [Z] (suspend 모드)를 눌러 작업을 일단 중지시킨뒤 'bg' 라고 명령을 내린다. (참고) 인터럽트키 [CTRL] +[C] : 작업취소 [CTRL] +[D] : 작업 정상 종료 [CTRL] +[Z] : 작업 대기 (4) 현재 작업중인 process의 확인 : 'jobs'라고 명령을 내리면 된다. + 기호로 표시된 작업이 먼저 실행되는 job이고 -기호가 그다음이다. (5) process를 중지시키기 : kill명령을 이용하여 중지, 종료 등을 할 수 있다. 1) 사용법 kill %job_number 2) 사용예 ㄱ. 작업의 중지 kill %1 => job번호가 1인 작업을 중지 시킨다. ㄴ. 작업의 강제종료시키기 kill -9 %1 => job번호가 1인 작업을 강제 종료시킨다. (참고) kill 명령은 job번호와 PID(process ID)모두 사용가능하다. job번호는 앞에 %를 붙여서 구분하고 PID인 경우에는 그냥 번호만 쓴다. 2. 관련명령어 (1) ps(process status) 1) 설명: 현재 프로세스들의 상태를 PID(Process ID)와 함께 보여준다. 리눅스에서는 사용자와 파일 뿐만아니라 프로세스도 번호로 관리한다. 2) 사용법 ps [option(s)] 3) option -a : 다른 사용자에 의해서 생성된 프로세스들도 보여준다. (u,x옵션과 연계해서 사용한다.) -u : 프로세스의 소유자에 대한 정보 등 매우 자세하게 보여준다. -l : 프로세스의 정보를 옆으로 길게 보여준다. (우선순위값과 관련된 PRI와 NI값을 확인할 수 있다. -x : daemon process등 터미널의 컨트롤과 관련이 없는 프로세스도 보여준다. 일반적으로 말하 는 데몬프로세스도 보여준다. 보통 ps명령을 실행하면 현재 Shell의 자식 프로세스들만 보여주는데, 이 옵션으로 다른 프로세스들도 볼 수가 있다. (BSD계열) System V계열인 경우에는 -x대신에 -e를 사용할 수 있고, -u 대신에 -uf옵션을 사용할 수 있다. -e : 해당 프로세스에 관련된 환경변수 정보를 함께 출력한다. -f : 프로세스 간의 상속관계를 보여준다.(PID, PPID값이 표시된다.) (참고2) daemon process daemon process란 daemon(악마)처럼 앞에 나타나지 않고 사용자가 모르게 뒤에서 시스템의 관리 를 위해 움직이는 프로세스를 말한다. 보통 시스템이 부팅이 될 때 자동적으로 실행이 된다. ftpd, inetd, lpd, nfsd 등이 있다. 4) 사용예 ㄱ. [posein@www posein]$ ps PID TTY TIME CMD 23563 pts/0 00:00:00 bash 23594 pts/0 00:00:00 ps ㄴ. ps -au => 현재 시스템상의 process들 중 터미널과 관련이 있는 모든 process들을 소유자 정보와 함께 보여준다. ㄷ. [posein@www posein]$ ps -aux |more USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 1368 548 ? S May02 0:04 init [3] root 2 0.0 0.0 0 0 ? SW May02 0:00 [keventd] => 현재 시스템상에서 움직이고 있는 모든 process들을 소유자의 정보와 함께 보여준다. ㄹ. [posein@www posein]$ ps -ef |more UID PID PPID C STIME TTY TIME CMD root 1 0 0 May02 ? 00:00:04 init [3] root 2 1 0 May02 ? 00:00:00 [keventd] => sysV 계열에 사용하는 옵션형태로 내용은 위와 비슷하다. 참고로 ps옵션에서 BSB계열 의 -aux와 SYSTEM V계열의 -ef옵션은 거의 유사하다. 리눅스에서는 현재 이 두계열의 옵션 모두 지원한다. ㅁ. [posein@www posein]$ ps -aux |grep sendmail root 743 0.0 0.4 5580 2208 ? S May09 0:04 sendmail: accepti smmsp 753 0.0 0.3 4852 1900 ? S May09 0:00 sendmail: Queue r => 현재 시스템상의 프로세스중 sendmail의 프로세스를 보여준다. ㅂ. [posein@www posein]$ ps -aux |grep posein root 27264 0.0 0.2 2216 1152 ? S 21:39 0:00 login -- posein posein 27265 0.0 0.2 5496 1432 pts/0 S 21:39 0:00 -bash posein 27398 0.0 0.1 2700 732 pts/0 R 21:50 0:00 ps -aux => 현재 시스템상의 프로세스중 posein 이라는 사용자의 프로세스를 보여준다. 5) ps상태보기 USER : BSD 계열에서 나타나는 항목으로 프로세스 소유자의 USERNAME UID : SYSTEM V계열에서 나타나는 항목으로 포로세스 소유자의 USERNAME PID : 프로세스의 식별번호 %CPU : CPU사용비율의 추정치(BSD) %MEM : 메모리 사용비율의 추정치(BSD) VSZ : K단위 또는 페이지 단위의 가상메모리 사용량 RSS : 실제 메모리 사용량. Resident Set Size TTY : 프로세스와 연결된 터미널 STAT : 현재 프로세스의 상태 - 값 R : 실행 중 혹은 실행될 수 있는 상태 S : sleep상태 (보통 20초이상된 상태) I : idle(비활동상태 : BSD, 중간적상태 : sysV) (보통 20초이하의 대기상태) T : 정지된 상태(suspend) Z : 좀비(zombie)프로세스 D : 디스크 관련 대기상태(BSD) P : 페이지 관련 대기상태(BSD) X : 메모리 확보를 위한 대기 상태(sysV) K : 사용가능한 커널 프로세스(AIX) W : 스왑 OUT된 상태 N : nice되어진 상태 > : 우선순위가 인위적으로 높아진 상태 START : 프로세스 시작 시간 또는 날짜 TIME : 총 CPU사용시간 COMMAND : 프로세스의 실행 명령행 STIME(sysV) : 프로세스가 시작된 시간 혹은 날짜 C(sysV), CP(BSD) : 짧은 기간 동안의 CPU사용률 F : 프로세스의 플래그들 PPID : 부모 프로세스의 PID PRI : 실제 실행 우선 순위 NI : nice 우선순위 번호 WCHAN : 프로세스를 기다리고 있는 이벤트 PLAGS : 프로세스와 관련된 숫자 값 (2) kill 1) 설명: 프로세스에 특정한 signal을 보내는 명령이다. 보통 실행중인 프로세스에 종료 신호를 보낸다. 보통 중지시킬 수 없는 프로세스를 종료시킬때 많이 사용한다. 2) 사용법 kill [option] [-시그널번호 or -시그널이름] PID => kill 명령 뒤에 어떤 프로세스의 PID(Process ID)를 적어주면 그 프로세스에 종료시그널을 보내게 된다. 보통의 경우 종료시킬 수 있으며, 만약에 종료되지 않으면 9를 signal_number 에 써 줌으로써 강제로 종료시킬 수 있다. kill [option] [-시그널번호 or -시그널이름] %작업번호 3) option -l : 시그널의 종류를 나열한다. 시그널의 종류는 시그널 번호순서대로 나열한다. 4) signal_number와 이름 1 SIGHUP(HUP) : hang up의 약자로 프로세스를 재시작시키는 시그널이다. 2 SIGINT(INT) : 인터럽트. 실행을 중지시킨다. [CTRL] + [C] 를 눌렀을 때 보내지는 시그널 이다. 3 QUIT : 실행중지. 9 SIGKILL(KILL) : 무조건 종료, 즉 강제 종료시키는 시그널이다. 15 SIGTERM(TERM) : Terminate의 약자로 가능한 정상 종료시키는 시그널로 kill 명령의 기본 시그널이다. 18 CONT : Continue. STOP등에 의해 정지된 프로세스를 다시 실행시킨다. 19 STOP : 무조건적, 즉각적 정지 20 TSTP : 실행 정지후 다시 실행을 계속하기 위하여 대기시키는 시그널이다. [CTRL] +[Z] 를 눌렀을 때 보내지는 시그널이다. 5) 참고 kill -l 이라고 써주면 signal_number에 보내줄 수 있는 시그널의 종류들을 보여주며, signal_ number에 숫자 대신에 직접 이름을 써 주어도 된다. man 을 참조하려면 man 7 signal 하면 된다. 6) 사용예 ㄱ. kill -l => 시그널의 종류를 나열한다. ㄴ. kill 724 => 724번 프로세스에 디폴트시그널인 15번 시그널을 보낸다. 같은 명령으로 'kill -15 724', 'kill -TERM 724'등이 있다. ㄷ. kill -9 756 757 758 => pid가 756, 757,758인 프로세스를 중단한다. 'kill -KILL PID', 'kill -SIGKILL PID' 라고 명령내려도 된다. ㄹ. kill -HUP 10118 => pid가 10118인 프로세스를 재시작한다. 'kill -1 10118'과 같다. ㅁ. kill %2 => 작업번호가 2인 프로세스를 종료시킨다. 7) 프로세스 종료시 유의점 프로세스를 종료시에는 [CTRL] +[C]나 기본시그널인 TERM 시그널(-15)로 정상적으로 종료를 시도하는 것이 좋다. 그래도 프로세스가 종료가 안되면 KILL 시그널(-9)을 사용하면 된다. (3) killall 1) 설명: 같은 데몬의 여러 프로세스를 한번에 죽이는 경우에 사용한다. Killall은 프로세스이름 으로 프로세스를 종료시킨다. 2) 사용법 killall [option] 프로세스명 3) option -HUP : 재시작한다. 4) 사용예 ㄱ. killall httpd => Apache 웹서버 데몬을 모두 종료한다. ㄴ. killall mysqld => mysql 데몬을 모두 종료한다. ㄷ. killall -HUP xinetd => xinetd 데몬을 다시 실행시킨다. (4) pstree 1) 설명 : 프로세스들을 계층적인 트리구조 형태로 출력해준다. 2) 사용법 pstree [option] 3) option -a : 각 프로세스의 명령행 인자까지 보여준다. -h : 현재 프로세스와 그것의 조상 프로세스를 하이라이트로 강조해서 보여준다. -n : PID 값으로 정렬해서 보여준다. 기본값은 이름으로 출력한다. -p : PID 값을 같이 보여준다. 4) 사용예 [posein@www posein]$ pstree init-+-apmd |-atd |-automount |-bdflush |-crond---crond---run-parts---awk |-eth0 |-eth1 |-gpm |-httpd---10*[httpd] => (결과설명) 최초로 실행되는 프로세스인 init가 왼쪽 상단에 나타나며 자식 프로세스는 오른쪽에 위치 한다. 또한 프로세스앞에 n*은 실행되고 있는 프로세스의 갯수이다. (5) top 1) 설명: 현재시스템의 프로세스 상태를 연속적으로 화면에 보여준다. 2) 사용법 top [option] 3) option -d 갱신시간 : 화면 갱신시간을 설정 -q : 화면을 계속 갱신한다. -i : idle상태와 zombie 프로세스를 무시한다. 4) 사용예 [root@www root]# top 1:17am up 1 day, 13:06, 3 users, load average: 0.00, 0.00, 0.00 68 processes: 66 sleeping, 2 running, 0 zombie, 0 stopped CPU states: 0.0% user, 0.0% system, 0.0% nice, 100.0% idle Mem: 513064K av, 363976K used, 149088K free, 0K shrd, 161724K buff Swap: 265032K av, 0K used, 265032K free 49916K cached PID USER PRI NI SIZE RSS SHARE STAT %CPU %MEM TIME COMMAND 1 root 8 0 544 544 472 S 0.0 0.1 0:04 init 2 root 8 0 0 0 0 SW 0.0 0.0 0:00 keventd 3 root 9 0 0 0 0 SW 0.0 0.0 0:00 kapm-idled 4 root 9 0 0 0 0 SW 0.0 0.0 0:00 kswapd 5 root 9 0 0 0 0 SW 0.0 0.0 0:00 kreclaimd 5) top 항목설명 PID : Process ID PPID : Parent Process ID UID : 소유자의 User ID USER : 소유자 PRI : Priority(우선순위) NI : Nice Value ( -20 ~ 19 사이의 값으로 작을 수록 우선순위가 높아짐) SIZE : 프로세스의 코드와 데이터의 크기(KB단위) TSIZE : 프로세스의 코드 사이즈 DSIZE : 프로세스의 데이터 사이즈 SWAP : 프로세스가 swap한 메모리양 RSS : 프로세스가 사용하는 실제 메모리양 SHARE : 프로세스가 사용하는 공유 메모리의 양' STAT : 현재 프로세스의 상태를 나타낸다. LIB : 라이브러리 페이지의 크기 %CPU : CPU 사용 시간 퍼센트 %MEM : 메모리 사용 퍼센트 TIME : 프로세스가 시작하여 사용한 총 CPU 시간 COMMAND : 프로세스를 실행한 명령어 라인 6) top 실행 중의 명령어 옵션 SPACE : 화면을 갱신한다. h, ? : 도움말을 출력한다. k : kill명령을 내린다. PID값을 입력하면 종료신호를 보낸다. i : Zombi, idle 프로세스의 출력을 on/off한다. n 또는 # : 출력한 프로세스의 수를 지정한다. q : top을 종료 r : Nice 값을 변경 s : 화면을 갱신하는 시간을 변경 F,f : 보여줄 항목을 추가하거나 삭제 O,o : 보여줄 항목의 순서를 바꿈 l : top의 맨 윗줄(uptime)을 on/off한다. m : 메모리의 관련된 항목을 on/off한다. t : 프로세스와 CPU항목을 on/off한다. c : Command line의 옵션을 on/off한다. M : 프로세스의 RSS값을 정렬한다. P : %CPU 값으로 정렬(기본값) T : Time값으로 정렬 W : 바꾼 설정을 저장 (6) jobs 1) 설명 : 백그라운드로 실행중인 프로세스나 현재중지된 프로세스의 목록을 출력해주는 명령어 이다. 2) 사용법 jobs [option] 3) option -l : 프로세스번호를 추가해서 보여준다. 4) 사용예 ㄱ. [posein@www posein]$ jobs [1]- Running find / -name '*.txt' 2>/dev/null >list.txt & [2]+ Stopped vim abc.txt => +는 현재 실행중인 프로세스를 나타내고 -기호는 이전에 실행되었던 프로세스를 의미한 다. ㄴ. [posein@www posein]$ jobs -l [1]- 27832 Running find / -name '*.txt' 2>/dev/null >list.txt & [2]+ 27833 Stopped (tty output) vim abc.txt => 프로세스번호도 같이 보여준다. 위 결과는 find 라는 작업이 먼저 수행되었고 그 다음 vi작업이 실행되었다. 현재 수행중인 작업은 vi 이다. 즉 이 경우에 fg라고 명령내리면 작업번호 2가 수행된다. (7) fg 1) 설명 : 백그라운드 프로세스를 포그라운드 프로세스로 전환하는 명령이다. 2) 사용법 fg [%작업번호] 3) 사용예 ㄱ. [posein@www posein]$ fg => 백그라운드 작업을 포그라운드작업으로 전환한다. 만약 백그라운드작업이 여러개가 있을 경우 별도의 작업번호를 부여하지 않으면 현재 수행중인(+기호가 붙은) 작업을 전환한다. ㄴ. [posein@www posein]$ fg %2 => 작업번호 2번인 작업을 포그라운드작업으로 전환한다. 4) 참고 : 포그라운드로 실행중인 작업을 끝내려면 ctrl+c키를 눌러 작업을 종료시킨다. (8) bg 1) 설명 : 포그라운드프로세스를 백그라운드 작업으로 전환하는 명령이다. 프로세스를 실행한 후 [CTRL]+[Z]키를 눌러 작업을 잠시 중지시킨 후에 bg명령어를 이용하여 작업을 백그라운 드로 보낼 수 있다. 2) 사용법 bg [%작업번호] 3) 사용예 [posein@www posein]$ find / -name '*.txt' 2>/dev/null > list.txt // 포그라운드 // [CTRL]+[Z]키를 눌러 대기시킨다. [1]+ Stopped find / -name '*.txt' 2>/dev/null >list.txt [posein@www posein]$ bg [1]+ find / -name '*.txt' 2>/dev/null >list.txt & => 백그라운드로 전환된다. (참고) 프로세스 우선순위 멀티태스킹(Multi-Tasking)이란 한 시스템에서 여러 개의 프로세스가 작동되는 것을 말한다. 리눅스에서 이러한 작업은 프로세스 스케줄러가 정해진 시간만큼만 CPU를 사용할 수 있도록 프로 세스를 교체시키기 때문이다. 프로세스에는 일정한 순서를 나타내는 우선순위가 있다. 이 우선순위 를 나타내는 것이 priority와 nice값이다. 이 값은 ps -l로 확인할 수 있다. PRI는 프로세스의 실제 우선순위로 리눅스가 계산하여 부여한다. 이 PRI를 부여할 때 NI값이 고려된다. NI는 PRI값에 영향을 주기 위해 프로세스 소유자나 슈퍼유저가 설정한 번호로 nice명령을 이용하여 그 값을 설정 할 수 있다. (9) nice 1) 설명 : 프로세스의 우선순위를 변경하는 명령으로 NI값을 설정할 수 있다. NI값은 -20 ~ 19 까지 있는데 값이 작을 수록 우선순위가 높다. 일반 사용자는 NI값을 증가시킬 수밖에 없고 루트권한자는 값을 감소시켜 우선순위를 높일 수 있다. 기본값은 0이다. 2) 사용법 nice -값 프로세스명 3) 사용예 [posein@www posein]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 100 S 501 20843 20842 0 76 0 - 566 wait4 pts/2 00:00:00 bash 000 T 501 20893 20843 0 69 0 - 685 do_sig pts/2 00:00:00 vi 000 R 501 20904 20843 0 78 0 - 752 - pts/2 00:00:00 ps [posein@www posein]$ nice -10 bash [posein@www posein]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 100 S 501 20843 20842 0 73 0 - 566 wait4 pts/2 00:00:00 bash 000 T 501 20893 20843 0 69 0 - 685 do_sig pts/2 00:00:00 vi 000 S 501 20906 20843 0 77 10 - 564 wait4 pts/2 00:00:00 bash 000 R 501 20923 20906 0 79 10 - 753 - pts/2 00:00:00 ps => bash의 NI값을 10으로 설정한다. NI값을 변경하면 bash의 자식프로세스인 NI값도 바뀐다. [root@www /root]# nice --10 bash => bash의 NI값을 -10으로 설정한다. (참고) bash와 NI값 bash는 로그할 때의 부여받는 환경에 가까워서 NI값을 변경하면 실제적으로 우선순위의 변동보다 새로운 bash를 부여받는 쪽에 가깝다. (10) renice 1) 설명 : 실행중인 프로세스의 우선순위를 변경할 때 사용하는 명령으로 오직 그 프로세스의 소유자와 루트권한자만이 명령을 내릴 수 있다. 이 명령도 NI값을 부여함으로서 우선 순위가 변경되며 루트권한자만이 프로세스의 우선순위를 높일 수 있다. 2) 사용법 renice [options] 값 PID 3) options -g : 그룹 ID 지정 -u : 사용자 ID 지정 -p : 프로세스 ID 지정(초기값) 4) 사용예 ㄱ. [posein@www posein]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 100 S 501 20843 20842 0 69 0 - 566 wait4 pts/2 00:00:00 bash 000 T 501 20893 20843 0 69 0 - 685 do_sig pts/2 00:00:00 vi 000 S 501 20906 20843 0 79 10 - 564 wait4 pts/2 00:00:00 bash 000 R 501 20937 20906 0 77 10 - 752 - pts/2 00:00:00 ps [posein@www posein]$ renice 15 20906 20906: old priority 10, new priority 15 [posein@www posein]$ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 100 S 501 20843 20842 0 69 0 - 566 wait4 pts/2 00:00:00 bash 000 T 501 20893 20843 0 69 0 - 685 do_sig pts/2 00:00:00 vi 000 S 501 20906 20843 0 77 15 - 564 wait4 pts/2 00:00:00 bash 000 R 501 20939 20906 0 79 15 - 752 - pts/2 00:00:00 ps => 20906작업의 NI값을 15로 바뀌면서, PRI는 적당한 값으로 자동 설정된다. ㄴ. [root@www root]# renice 1 987 -u daemon root -p 32 => 프로세스 ID가 987, 32 인 것과 사용자가 daemon, root인 모든 프로세스의 우선권값을 1로 바꾼다. (11) nohup 1) 설명: 이 명령은 사용자가 로그아웃하거나 터미널창을 닫아도 해당 프로세스를 백그라운드로 작업될 수 있도록 해주는 명령이다. 2) 사용법 nohup 명령 3) 사용예 nohup tar cvf source.tar /opt/src & 4) 참고 만약 표준출력이 화면이었는데 사용자가 로그아웃하게 되면 표준출력과 표준에러를 'nohup.out' 이라는 파일에 저장한다. 현재 작업디렉토리에 쓰기작업이 불가능한 경우에는 ~/nohup.out를 생성하고 그것도 불가능하게 되면 실행이 되지 않는다. 또한 우선권을 5 만큼 증가시켜 수행하고 실행한 명령을 자동으로 백그라운드로 보내지 않으므로 직접 명령행 뒤에 '&'를 붙여 백그라운드 로 보내주어야 한다.