Chapter 06. 프로세스관리하기
00. 개요 01. 프로세스의개념 02. 프로세스관리명령 03. 포그라운드, 백그라운드프로세스와작업제어 04. 작업예약
프로세스가무엇인지설명할수있다. 프로세스목록을확인하고특정프로세스를검색할수있다. 프로세스를강제로종료할수있다. 프로세스관리도구로전체프로세스의상태를확인할수있다. 포그라운드와백그라운드작업의차이를설명할수있다. 백그라운드로작업을실행하고포그라운드로변환할수있다. 정해진시간에혹은주기적으로명령이실행되도록설정할수있다.
리눅스실습스터디맵
00 개요 [ 그림 6-1] 6 장의내용구성
01 프로세스의개념 프로세스 : 현재시스템에서실행중인프로그램 프로세스의부모 - 자식관계 프로세스는부모 - 자식관계를가지고있음 필요에따라부모프로세스 (parent process) 는자식프로세스 (child process) 를생성하고, 자식프로세스는또다른자식프로세스생성가능 부팅할때스케줄러가실행한프로세스인 systemd 와 kthreadd 프로세스를제외하면모든프로세스는부모프로세스를가지고있음 자식프로세스는할일이끝나면부모프로세스에결과를돌려주고종료 프로세스의번호 각프로세스는고유한번호를가지고있는데이것이 PID 프로세스의종류 데몬프로세스 특정서비스를제공하기위해존재하며리눅스커널에의해실행 고아프로세스 자식프로세스가아직실행중인데부모프로세스가먼저종료된자식프로세스는고아 (orphan) 프로세스 1 번프로세스가고아프로세스의새로운부모프로세스가되어고아프로세스의작업종료지원 좀비프로세스 자식프로세스가실행을종료했는데도프로세스테이블목록에남아있는경우 좀비프로세스는프로세스목록에 defunct 프로세스라고나오기도함 좀비프로세스가증가하면프로세스테이블의용량이부족해서일반프로세스가실행되지않을수도있음
02 프로세스관리명령 프로세스목록보기 현재실행중인프로세스의목록을보는명령 : ps 유닉스 (SVR4) 옵션 : 묶어서사용할수있고, 붙임표로시작한다 ( 예 : -ef). BSD 옵션 : 묶어서사용할수있고, 붙임표로시작하지않는다 ( 예 : aux). GNU 옵션 : 붙임표두개로시작한다 ( 예 : --pid).
02 프로세스관리명령 현재단말기의프로세스목록출력하기 : ps ps 명령을옵션없이사용하면현재셸이나터미널에서실행한사용자프로세스에대한정보를출력 ps PID TTY TIME CMD 5501 pts/1 00:00:00 bash 6162 pts/1 00:00:00 ps 프로세스의상세정보출력하기 : -f 옵션 프로세스의상세한정보를출력 : PPID 와터미널번호, 시작시간등 ps -f UID PID PPID C STIME TTY TIME CMD user1 5501 5500 0 00:32 pts/1 00:00:00 -bash user1 6163 5501 0 04:33 pts/1 00:00:00 ps -f
02 프로세스관리명령 터미널에서실행한프로세스의정보출력하기 : a 옵션 터미널에서실행한프로세스의정보를출력 ps a PID TTY STAT TIME COMMAND 860 tty4 Ss+ 0:00 /sbin/getty -8 38400 tty4 864 tty5 Ss+ 0:00 /sbin/getty -8 38400 tty5 872 tty2 Ss+ 0:00 /sbin/getty -8 38400 tty2 876 tty3 Ss+ 0:00 /sbin/getty -8 38400 tty3 883 tty6 Ss+ 0:00 /sbin/getty -8 38400 tty6 988 tty7 Ss+ 1:39 /usr/bin/x -core :0 -auth /var/run/lightdm/root/:0 -n 993 tty1 Ss+ 0:00 /sbin/getty -8 38400 tty1 ( 생략 )
02 프로세스관리명령 터미널에서실행한프로세스의상세정보출력하기 : a 옵션과 u 옵션 a 옵션과 u 옵션을함께사용하면터미널에서실행한프로세스의상세정보를출력 : CPU 와메모리사용량등 ps au USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 860 0.0 0.0 4668 864 tty4 Ss+ 2월22 0:00 /sbin/getty - root 864 0.0 0.0 4668 860 tty5 Ss+ 2월22 0:00 /sbin/getty - root 872 0.0 0.0 4668 860 tty2 Ss+ 2월22 0:00 /sbin/getty - root 876 0.0 0.0 4668 864 tty3 Ss+ 2월22 0:00 /sbin/getty - ( 생략 ) user1 5638 0.0 0.3 8304 3356 pts/7 Ss+ 00:32 0:00 -bash user1 6166 0.0 0.1 6460 1176 pts/1 R+ 04:37 0:00 ps au
02 프로세스관리명령 전체프로세스목록출력하기 ( 유닉스옵션 ) : -e 옵션 -e 옵션은시스템에서실행중인모든프로세스를출력 TTY 의값이? 인것은대부분데몬으로시스템이실행한프로세스 ps -e more PID TTY TIME CMD 1? 00:00:02 init 2? 00:00:00 kthreadd 3? 00:00:01 ksoftirqd/0 5? 00:00:00 kworker/0:0h ( 생략 ) 22? 00:00:00 devfreq_wq 23? 00:00:07 kworker/0:1 25? 00:00:00 khungtaskd --More-- -ef 옵션사용 : 전체프로세스의더자세한정보출력 [ ps -ef more UID PID PPID C STIME TTY TIME CMD root 1 0 0 2월22? 00:00:02 /sbin/init root 2 0 0 2월22? 00:00:00 [kthreadd] root 3 2 0 2월22? 00:00:01 [ksoftirqd/0] ( 생략 ) root 25 2 0 2월22? 00:00:00 [khungtaskd] --More--
02 프로세스관리명령 전체프로세스목록출력하기 (BSD 옵션 ) : ax 옵션 시스템에서실행중인모든프로세스를출력 ps ax more PID TTY STAT TIME COMMAND 1? Ss 0:02 /sbin/init 2? S 0:00 [kthreadd] 3? S 0:01 [ksoftirqd/0] ( 생략 ) 23? S 0:07 [kworker/0:1] 25? S 0:00 [khungtaskd] --More-- aux 옵션은 -ef 처럼시스템에서실행중인모든프로세스에대한자세한정보를출력 ps aux more USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 4052 2320? Ss 2월22 0:02 /sbin/init root 2 0.0 0.0 0 0? S 2월22 0:00 [kthreadd] root 3 0.0 0.0 0 0? S 2월22 0:01 [ksoftirqd/0] ( 생략 ) root 22 0.0 0.0 0 0? S< 2월22 0:00 [devfreq_wq] root 23 0.0 0.0 0 0? S 2월22 0:07 [kworker/0:1] --More--
02 프로세스관리명령 특정사용자의프로세스목록출력하기 : -u 옵션 ps -u user1 PID TTY TIME CMD 1646? 00:00:01 gnome-keyring-d 1648? 00:00:01 init 1717? 00:00:00 ssh-agent 1727? 00:00:04 dbus-daemon 1733? 00:00:00 upstart-event-b ( 생략 ) 더상세한정보를보고싶으면 -f 옵션을함께사용 ps -fu user1 UID PID PPID C STIME TTY TIME CMD user1 1646 1 0 2월22? 00:00:01 /usr/bin/gnome-keyring-daemon -- user1 1648 1378 0 2월22? 00:00:01 init --user user1 1717 1648 0 2월22? 00:00:00 ssh-agent user1 1727 1648 0 2월22? 00:00:04 dbus-daemon --fork --session --a user1 1733 1648 0 2월22? 00:00:00 upstart-event-bridge ( 생략 )
02 프로세스관리명령 특정프로세스정보출력하기 : -p 옵션 -p 옵션과함께특정 PID 를지정하면해당프로세스의정보를출력 ps -fp 5501 UID PID PPID C STIME TTY TIME CMD user1 5501 5500 0 00:32 pts/1 00:00:00 -bash ps 명령을이용해특정프로세스정보검색하기 ps 명령과 grep 명령을 로연결하여특정프로세스에대한정보를검색 ps -ef grep bash user1 2205 2197 0 2월22 pts/5 00:00:00 bash user1 5501 5500 0 00:32 pts/1 00:00:00 -bash user1 5638 5637 0 00:32 pts/7 00:00:00 -bash user1 6185 5501 0 04:50 pts/1 00:00:00 grep --color=auto bash
02 프로세스관리명령 pgrep 명령을이용해특정프로세스정보검색하기 bash 패턴을지정하여검색한예 pgrep -x bash 2205 5501 5638
02 프로세스관리명령 pgrep 명령을이용해특정프로세스정보검색하기 pgrep 의경우 -l 옵션을지정해도단지 PID 와명령이름만출력 pgrep -l bash 2205 bash 5501 bash 5638 bash 더자세한정보를검색하려면 pgrep 명령을 ps 명령과연결하여사용 ps -fp $(pgrep -x bash) UID PID PPID C STIME TTY STAT TIME CMD user1 2205 2197 0 2월22 pts/5 Ss+ 0:00 bash user1 5501 5500 0 00:32 pts/1 Ss 0:00 -bash user1 5638 5637 0 00:32 pts/7 Ss+ 0:00 -bash -u 옵션으로사용자명을지정하여검색 ps -fp $(pgrep -u user1 bash) UID PID PPID C STIME TTY STAT TIME CMD user1 2205 2197 0 2월22 pts/5 Ss+ 0:00 bash user1 5501 5500 0 00:32 pts/1 Ss 0:00 -bash user1 5638 5637 0 00:32 pts/7 Ss+ 0:00 -bash
02 프로세스관리명령 kill 명령을이용해프로세스종료하기 kill 예 : man 을실행시킨프로세스를찾아서종료시키기 ps -fp $(pgrep -x man) UID PID PPID C STIME TTY TIME CMD user1 6193 5501 0 04:56 pts/1 00:00:00 man ps kill 6193
02 프로세스관리명령 프로세스강제로종료하기 단순히 kill 명령으로는종료되지않는경우강제종료시그널인 9 번을보낸다. 강제종료예 : kill 명령으로종료되지않음 ps -fp $(pgrep -x sh) UID PID PPID C STIME TTY STAT TIME CMD user1 2087 1974 0 2월22? Ss 0:00 /bin/sh -c /usr/bin/gtk-windo user1 6230 5501 0 04:59 pts/1 S+ 0:00 sh kill 6230 ps -fp $(pgrep -x sh) UID PID PPID C STIME TTY STAT TIME CMD user1 2087 1974 0 2월22? Ss 0:00 /bin/sh -c /usr/bin/gtk-windo user1 6230 5501 0 04:59 pts/1 S+ 0:00 sh 강제종료시그널인 9 번을보내강제로종료 kill -9 6230
02 프로세스관리명령 pkill 명령을이용해프로세스종료하기 PID 가아니라프로세스의명령이름 (CMD) 으로프로세스를찾아종료 ps -fp $(pgrep -x man) UID PID PPID C STIME TTY STAT TIME CMD user1 6396 5501 0 05:07 pts/1 S+ 0:00 man pkill user1 6412 5638 0 05:07 pts/7 S+ 0:00 man pkill pkill -x man pgrep -x man
02 프로세스관리명령 프로세스관리도구 top 명령 : 현재실행중인프로세스에대한정보를주기적으로출력 top 내부명령
02 프로세스관리명령 top 실행화면
02 프로세스관리명령 시스템정보 : GNOME
03 포그라운드, 백그라운드프로세스와작업제어 포그라운드작업 포그라운드프로세스 : 사용자가입력한명령이실행되어결과가출력될때까지기다려야하는포그라운드방식으로처리되는프로세스 이를작업제어에서는포그라운드작업이라고함 sleep 100 포그라운드작업 sleep 명령이끝날때까지기다려야한다. 백그라운드작업 백그라운드프로세스 : 명령을실행하면명령의처리가끝나는것과관계없이곧바로프롬프트가출력되어사용자가다른작업을계속할수있음 작업제어에서는백그라운드작업이라고함 sleep 100& 백그라운드작업 [1] 6852 프롬프트가바로나와다른명령을실행할수있다. 백그라운드작업과출력방향전환하기 백그라운드로처리할때는주로출력과오류방향전환을하여실행결과와오류메시지를파일로저장 find / -name passwd > pw.dat 2>&1 & pw.dat 에결과와오류를저장한다. [2] 6853
03 포그라운드, 백그라운드프로세스와작업제어 작업제어 작업제어는작업전환과작업일시중지, 작업종료를의미 작업전환 : 포그라운드작업-> 백그라운드작업, 백그라운드작업-> 포그라운드작업으로전환 작업일시중지 : 작업을잠시중단 작업종료 : 프로세스를종료하는것처럼작업을종료 작업목록보기 : jobs
03 포그라운드, 백그라운드프로세스와작업제어 jobs 명령예 jobs [1]- 실행중 sleep 100 & [2]+ 실행중 find / -name passwd > pw.dat 2>&1 &
03 포그라운드, 백그라운드프로세스와작업제어 작업전환하기 작업전환예 : 포그라운드 -> 백그라운드 jobs 백그라운드작업이없다. sleep 100 포그라운드로실행한다. ^Z Ctrl+z로일시중지한다. [1]+ 정지됨 sleep 100 일시중지된상태이다. bg %1 백그라운드로전환한다. [1]+ sleep 100 & jobs [1]+ 실행중 sleep 100 & 백그라운드로실행중이다.
03 포그라운드, 백그라운드프로세스와작업제어 작업전환하기 작업전환예 : 백그라운드 -> 포그라운드 jobs [1]+ 실행중 sleep 100 & fg 포그라운드로전환한다. sleep 100 포그라운드로실행중이다. 작업종료하기 : Ctrl+c 포그라운드작업은 Ctrl+c 를입력하면대부분종료 sleep 100 포그라운드로실행중이다. ^C 강제종료한다. 백그라운드작업은 kill 명령으로강제종료 : PID 또는 % 작업번호 sleep 100& 백그라운드로실행중이다. [1] 6403 kill %1 강제종료한다. [1]+ 종료됨 sleep 100 Enter를한번더입력해야메시지가출력된다.
03 포그라운드, 백그라운드프로세스와작업제어 로그아웃후에도백그라운드작업계속실행하기 : nohup 로그아웃한다음에도작업이완료될때까지백그라운드작업을실행해야할경우가있다. 이때 nohup 명령을사용 nohup 명령사용예 [ nohup find / -name passwd & [1] 6867 nohup: 입력무시및 'nohup.out' 에출력추가 다시로그인하여파일내용확인 more nohup.out /usr/share/bash-completion/completions/passwd /usr/share/lintian/overrides/passwd /usr/share/doc/passwd /usr/bin/passwd find: '/root': 허가거부 find: '/proc/tty/driver': 허가거부 ( 생략 )
03 포그라운드, 백그라운드프로세스와작업제어 로그아웃후에도백그라운드작업계속실행하기 : nohup 명령실행시다음예와같이출력방향전환을하면 nohup.out 파일을생성하지않고지정한파일에결과와오류메시지를출력 nohup find / -name passwd > pw.dat 2>&1 & [1] 6874 exit 다시로그인하여파일내용확인 more pw.dat nohup: 입력무시 /usr/share/bash-completion/completions/passwd /usr/share/lintian/overrides/passwd /usr/share/doc/passwd /usr/bin/passwd find: '/root': 허가거부 find: '/proc/tty/driver': 허가거부 ( 생략 )
04 작업예약 특정한시간에작업을수행하도록예약할수있는두가지방법 정해진시간에한번만수행 정해진시간에반복수행 정해진시간에한번실행
04 작업예약 at 명령설치 : sudo apt-get install at, sudo apt-get install mailutils at 명령설정하기 at 명령을사용하여정해진시간에명령을실행하도록예약하려면 at 명령뒤에시간을명시 user1@myubuntu:~/linux_ex/ch6$ at 09:00 am warning: commands will be executed using /bin/sh at> 시간을지정하는형식 at 4pm + 3 days : 지금부터 3 일후오후 4 시에작업을수행한다. at 10am Jul 31 : 7 월 31 일오전 10 시에작업을수행한다. at 1am tomorrow : 내일오전 1 시에작업을수행한다. at 10:00am today : 오늘오전 10 시에작업을수행한다. at 로실행할명령은기본적으로표준입력으로지정 : 명령의입력을마치려면 ctrl+d 입력 user1@myubuntu:~/linux_ex/ch6$ at 09:00 am 시간을지정한다. at> ls -l ~user1 실행할명령을지정한다. at> <EOT> Ctrl+d를입력하여종료한다. job 1 at Tue Feb 25 09:00:00 2014 작업예약이완료되었다. user1@myubuntu:~/linux_ex/ch6$
04 작업예약 at 명령의실행결과확인하기 at 명령의실행결과는메일로전달 You have mail in /var/mail/user1 user1@myubuntu:~/linux_ex/ch6$ mail "/var/mail/user1": 1 message 1 new >N 1 user1 월 2월 24 14: 27/1198 Output from your job? Message 1: Return-Path: <user1@myubuntu> X-Original-To: user1 Delivered-To: user1@myubuntu Received: by myubuntu (Postfix, from userid 1000) id 1236F65222; Mon, 24 Feb 2014 14:22:01 +0900 (KST) Subject: Output from your job 5 To: user1@myubuntu Message-Id: <20140224052201.1236F65222@myubuntu> Date: Mon, 24 Feb 2014 14:22:01 +0900 (KST) From: user1@myubuntu (user1) 합계 148 -rw-r--r-- 1 user1 user1 8980 2월 20 21:19 examples.desktop drwxrwxr-x 7 user1 user1 4096 2월 24 06:28 linux_ex ( 생략 )
04 작업예약 at 작업파일확인하기 at 로생성된작업파일은 /var/spool/at 디렉터리에저장 user1@myubuntu:~/linux_ex/ch6$ at 11:10 am warning: commands will be executed using /bin/sh at> ls at> <EOT> job 6 at Tue Feb 25 11:10:00 2014 user1@myubuntu:~/linux_ex/ch6$ user1@myubuntu:~/linux_ex/ch6$ sudo ls -l /var/spool/cron/atjobs 합계 4 -rwx------ 1 user1 daemon 2417 2월 24 14:25 a0000601625542 user1@myubuntu:~/linux_ex/ch6$ root 사용자만 /var/spool/at 디렉터리내용확인가능
04 작업예약 at 작업목록확인하기 : -l 옵션, atq at 명령으로설정된작업의목록은 -l 옵션으로확인 user1@myubuntu:~/linux_ex/ch6$ at -l 6 Tue Feb 25 11:10:00 2014 a user1 user1@myubuntu:~/linux_ex/ch6$ atq 명령으로도확인가능 user1@myubuntu:~/linux_ex/ch6$ atq 6 Tue Feb 25 11:10:00 2014 a user1 user1@myubuntu:~/linux_ex/ch6$
04 작업예약 at 작업삭제하기 : -d 옵션, atrm at 명령으로설정한작업이실행되기전에삭제하려면 -d 옵션을사용하고삭제할작업번호를지정 1 작업예약 user1@myubuntu:~/linux_ex/ch6$ at 1am tomorrow warning: commands will be executed using /bin/sh at> ls at> <EOT> job 7 at Tue Feb 25 01:00:00 2014 user1@myubuntu:~/linux_ex/ch6$ 2 설정된작업확인 user1@myubuntu:~/linux_ex/ch6$ atq 7 Tue Feb 25 01:00:00 2014 a user1 6 Tue Feb 25 11:10:00 2014 a user1 user1@myubuntu:~/linux_ex/ch6$ 3 작업삭제 user1@myubuntu:~/linux_ex/ch6$ at -d 7 user1@myubuntu:~/linux_ex/ch6$ atrm 6 user1@myubuntu:~/linux_ex/ch6$ atq user1@myubuntu:~/linux_ex/ch6$
04 작업예약 at 명령사용제한하기 관련된파일 : /etc/at.allow 와 /etc/at.deny /etc/at.allow 파일과 /etc/at.deny 파일에는한줄에사용자이름을하나씩만기록 /etc/at.allow 파일이있으면이파일에있는사용자만 at 명령을사용할수있다. 이경우에 /etc/at.deny 파일은무시된다. /etc/at.allow 파일이없으면 /etc/at.deny 파일에지정된사용자를제외한모든사용자가 at 명령을사용할수있다. 만약두파일이모두없다면 root 만 at 명령을사용할수있다. 한사용자가두파일모두에속해있다면그사용자는 at 명령을사용할수있다. /etc/at.allow 파일이적용되기때문이다. /etc/at.deny 를빈파일로두면모든사용자가 at 명령을사용할수있는데, 이것이초기설정이다. at.deny 파일에 user1 사용자가기록되어있다면 at 명령을실행했을때사용권한이없다는메시지가출력 user1@myubuntu:~/linux_ex/ch6$ at You do not have permission to use at. user1@myubuntu:~/linux_ex/ch6$
04 작업예약 정해진시간에반복실행 crontab 파일형식
04 작업예약 crontab 파일생성하고편집하기 : crontab e crontab 편집기는기본적으로 VISUAL 또는 EDITOR 환경변수에지정된편집기를사용 user1@myubuntu:~/linux_ex/ch6$ EDITOR=vi;export EDITOR user1@myubuntu:~/linux_ex/ch6$ crontab -e 명령으로편집한파일을저장하면자동적으로 /var/spool/cron/crontabs 디렉터리에사용자이름으로생성 user1@myubuntu:~/linux_ex/ch6$ sudo ls -l /var/spool/cron/crontabs [sudo] password for user1: 합계 4 -rw------- 1 user1 crontab 1137 2월 24 14:55 user1 user1@myubuntu:~/linux_ex/ch6$ crontab 파일내용확인하기 : crontab l user1@myubuntu:~/linux_ex/ch6$ crontab l 30 23 1 * * /bin/ls -l ~user1 > ~user1/cron.out user1@myubuntu:~/linux_ex/ch6$ crontab 파일삭제하기 : crontab -r user1@myubuntu:~/linux_ex/ch6$ crontab -r user1@myubuntu:~/linux_ex/ch6$ crontab -l no crontab for user1 user1@myubuntu:~/linux_ex/ch6$
04 작업예약 crontab 명령사용제한하기 /etc/cron.allow, /etc/cron.deny 파일 cron.deny 파일은기본적으로있지만 cron.allow 파일은관리자가만들어야함 두파일이적용되는기준 /etc/cron.allow 파일이있으면이파일안에있는사용자만 crontab 명령을사용할수있다. /etc/cron.allow 파일이없고 /etc/cron.deny 파일이있으면이파일에사용자계정이없어야 crontab 명령을사용할수있다. /etc/cron.allow 파일과 /etc/cron.deny 파일이모두없다면시스템관리자만 crontab 명령을사용할수있다. 두파일이모두없는데일반사용자가 crontab 명령을사용하려고하면다음과같은메시지가출력 user1@myubuntu:~/linux_ex/ch6$ crontab -e You (user1) are not allowed to use this program (crontab) See crontab(1) for more information user1@myubuntu:~/linux_ex/ch6$