[리눅스마스터 1급] 이기적 이론서 6회차 정리 - 프로세스 관리
🏁 이기적 이론서 학습 범위
- PART 01 리눅스 시스템 관리
- CHAPTER 01 일반 운영 관리 (SECTION 03 프로세스 관리)
☑️ 프로세스 관련 명령어
프로세스 정보
- ps
/proc
디렉터리 이하에 프로세스와 연관된 가상 파일 시스템의 내용을 토대로 프로세스 정보를 출력한다.- Unix 스타일은
-
를 사용하지 않는다. - BSD 스타일은
-
를 사용한다. - GNU 스타일은
--
를 사용한다.
- Unix 스타일은
형식
ps [options]
옵션
옵션 설명 a 모든 사용자가 소유한 프로세스를 출력한다. (기본: 현재 사용자 프로세스만 출력) x 터미널에 연관되지 않은 프로세스도 출력한다. (기본: 터미널과 연관된 프로세스만 출력) -A 모든 프로세스를 출력한다. -e 모든 프로세스를 출력한다. -a 세션 리더와 터미널과 연관되지 않은 프로세스를 제외하고 모든 프로세스를 출력한다. 옵션: 지정한 프로세스 출력
옵션 설명 p 지정한 Process ID 목록 정보만 출력한다. -C - 지정한 프로세스의 실행 파일 이름의 정보만 출력한다. - 다수 입력이 가능하다. -u - 특정 사용자의 프로세스 정보를 출력한다.
- 다수 입력이 가능하다.옵션: 프로세스 표시 형식
옵션 설명 u 프로세스의 소유자 정보를 함께 출력한다. l - BSD 형식의 긴 형식으로 출력한다.
- F, UID, PID, PPID, PRI, NI, VSZ, RSS, WCHAN, STAT, TTY, TIME, CMD 순으로 출력한다.e 프로세스 정보와 함께 프로세스의 한경변수도 출력한다. -l 긴 포맷으로 출력한다. -o 사용자 정의 형식 지정이 가능하다. 옵션: 프로세스 장식
옵션 설명 f 프로세스 계층의 텍스트 형식의 트리 구조로 보여준다. -f - 전체 포맷으로 출력한다.
- 유닉스 스타일 옵션과 함께 사용하여 컬럼을 추가할 수 있다.예제
$ ps # 현재 셸과 관련된 프로세스 출력 $ ps -A # 현재 실행중인 모든 프로세스 출력 OR $ ps -e $ ps -ef # 현재 실행 중인 모든 프로세스의 정보를 전체 포맷으로 출력 $ ps -elf # 현재 실행 중인 모든 프로세스의 정보를 전체 포맷보다 더 많은 정보로 출력 $ ps aux # 터미널에 연관되지 않은 프로세스를 포함한 모든 사용자의 프로세스를 소유자 정보와 함께 프로세스 정보를 출력 # PID가 2861인 프로세스의 소유자와 프로세스 이름 출력, 프로세스 이름의 헤더는 출력하지 않음 $ ps -p 2861 -o user -o comm=
- ps 명령어 주요 항목 및 상태 코드는 많아서 생략
- pstree
- 프로세스를 트리 형태로 출력한다.
형식
pstree [options]
옵션
옵션 설명 -a 프로세스의 명령줄 인자를 출력한다. -h 현재 프로세스와 부모 프로세스를 강조 표시한다. -n 프로세스 이름 대신 PID순으로 정렬하여 출력한다. -p PID를 함께 출력한다. -s 특정 프로세스의 부모 프로세스를 출력한다. 예제
$ pstree -h # 모든 프로세스를 트리 형식으로 출력, 현재 프로세스와 부모 프로세스는 강조 표시
- top
- 현재 실행 중인 프로세스에 대한 정보를 실시간으로 제공한다.
형식
top [options]
옵션
옵션 설명 -n 지정한 숫자만큼 화면 출력을 갱신한 후 명령을 자동 종료한다. -u 지정한 사용자의 프로세스를 모니터링한다. -b 출력 결과를 파일이나 다른 프로그램으로 전달한다. -d 화면 갱신 주기를 초 단위로 설정한다. -p 지정한 PID의 프로세스를 모니터링 한다. 예제
$ top -u francis # francis 사용자의 프로세스 모니터링 $ top -p 2394 -d 1 # PID 2394의 정보를 1초 단위로 갱신하여 보여줌
- top의 주요항목 및 실행화면 단축 명령어 생략
프로세스 종료
- kill
- 프로세스에게 특정 시그널을 보낸다.
- 시그널을 지정하지 않으면 기본 값으로 프로세스 종료를 위한 TERM 시그널을 보낸다.
형식
kill [option] [pid]
옵션
옵션 설명 -signal, -s signal 지정한 시그널을 보낸다. -l 사용 가능한 시그널 목록을 출력한다. 예제
$ kill -9 -1 # PID가 1인 프로세스를 제외하고 모든 프로세스를 강제종료 $ kill -l # 사용가능한 시그널 목록을 테이블로 표시 $ kill 123 2345 # 프로세스 123과 2345에게 기본 시그널을 전송 # 프로세스 5555에게 SIGKILL 전송 $ kill -9 5555 OR $ kill -s 9 5555 OR $ kill -s SIGKILL 5555 OR $ kill -s KILL 5555 OR $ kill -KILL 5555 OR $ kill -SIGKILL 5555
- killall
- 지정한 이름에 부합하는 모든 프로세스에게 시그널을 보낸다.
- 시그널을 지정하지 않으면 SIGTERM이 전송된다.
- 지정한 프로세스 이름에 매칭되는 프로세스는 모두 종료된다.
형식
killall [options] processname
옵션
옵션 설명 -I, —ignore-case 대소문자 구분을 무시한다. -g, —process-group 프로세스가 속한 그룹의 프로세스에게 모두 시그널을 보낸다. -l, —list 사용할 수 있는 모든 시그널 목록을 표시한다. -s, —signal SIGTERM 대신 보낼 시그널을 지정한다. -u, —user 지정한 사용자의 모든 프로세스에게 시그널을 보낸다. -v, —verbose 시그널이 성공적으로 보내졌는지 표시한다. -w, —wait 모든 프로세스가 종료될 때까지 기다린다. -i 프로세스 종료 전 사용자에게 물어본다. 예제
$ killall Not_Response_Daemon # 지정한 이름의 모든 프로세스 종료 $ killall -I Not_Response_Daemon # 지정한 이름의 모든 프로세스를 종료 (대소문자 구분X) $ killall -9 -i bash # 프로세스 이름이 bash인 프로세스에게 SIGKILL 전송. 보내기 전 사용자에게 확인
- pkill
- 프로세스 이름과 지정한 패턴이 부합하는 프로세스만 종료한다.
형식
$ pkill [options] pattern
옵션
옵션 설명 -signal, —signal signal 보낼 시그널을 지정한다. -g, —pgroup pgrp… 지정한 그룹의 프로세스 중 패턴이 매칭되는 프로세스에게 시그널을 보낸다. -G, —group gid.. 지정한 리얼 그룹 ID의 프로세스 중 패턴이 매칭되는 프로세스에게 시그널을 보낸다. -t, —terminal term… 특정 터미널과 연관된 프로세스 중 패턴이 매칭되는 프로세스에게 시그널을 보낸다. -u, —euid euid… 특정 이펙티브 사용자 ID의 프로세스 중 패턴이 매칭되는 프로세스에게 시그널을 보낸다. -U, —uid uid… 특정 리얼 사용자 ID의 프로세스 중 패턴이 매칭되는 프로세스에게 시그널을 보낸다. 예제
$ pkill -HUP syslogd # 패턴이 syslogd와 프로세스 이름이 매칭되는 프로세스에게 HUP 시그널 전송
프로세스 전환
- jobs
- 현재 실행 중인 모든 jobs의 목록을 출력한다.
형식
jobs [options] [job name or number]
옵션
옵션 설명 -l PID 정보를 추가로 표시한다. -p PID만 표시한다. 예제
$ jobs # 모든 jobs의 목록 출력 $ jobs -l # PID 정보를 추가하여 모든 잡 목록 출력
- fg
- 백그라운드에 멈춰있던 잡을 포어그라운드로 보내 셸 프롬프트상에서 다시 실행한다.
형식
$ fg
예제
$ fg # 가장 최근의 잡을 포어그라운드로 전환 $ fg %3 # 잡 번호가 3인 잡을 포어그라운드로 전환 OR $ fg 3
- bg
- 포어그라운드의 잡을 백그라운드로 전환한다.
형식
bg [job]
옵션
옵션 설명 job - 백그라운드에서 실행하고 싶은 잡을 지정한다.
- 잡 번호가 1이라면 %1로 기재하고, 2라면 %2로 기재한다.
- 현재 잡은 %, %+, %% 중 하나를 사용하고 이전 잡은 %-, - 중 하나를 사용한다.예제
$ bg %3 # 잡 번호가 3인 잡을 백그라운드로 실행
프로세스 우선순위
- nice
- 프로세스의 우선순위를 의미하는 nice 값을 설정한다.
- 기본적으로 사용자 프로세스 사이에서 우선순위를 조정할 수 있고, 프로세스의 스케줄링에 영향을 줄 수 있다.
top
명령어 등으로 프로세스의 정보를 보면 NI 필드로 표현이 된다.- nice 값은 높은 우선순위를 뜻하는 -20에서 낮은 우선순위를 뜻하는 19 범위 안에서 설정할 수 있고, 기본값은 0이다.
- nice 값이 낮으면 많은 CPU 시간이 할당되고, 높으면 적은 CPU 시간이 할당된다.
형식
nice [options] [command arg]
옵션
옵션 설명 -n, —adjustment - nice 값을 기존의 값에 더한다.
- 값을 지정하지 않으면 기본값 10을 더한다.예제
$ nice # 프로세스가 생성될 때 기본 nice 값을 출력한다. # myfile.txt 인자를 넘기면서 nano 프로세스를 실행한다. # 기존의 nice 값에 13을 증가한다. # nice 값 변경 시 PRI 값도 변경된다. PRI는 기존의 PRI 값에 NI값이 더해진 값이다. $ nice -n13 nano myfile.txt OR $ nice -13 nano myfile.txt $ nice --10 bash # bash의 nice 값을 10 감소
- renice
- 현재 실행 중인 프로세스의
nice
값을 바꾼다.nice
는 새롭게 실행하는 프로세스를 대상으로 nice 값을 지정한다.
- 기존 값과 관계 없이 설정한 값으로 반영한다.
nice
는 현재nice
값 기준으로 증가, 감소하는 식으로 설정한다.
형식
renice [-n] priority [option]
옵션
옵션 설명 -n, —priority nice 값을 지정한다. -g, —pgrp 지정한 프로세스 그룹에게 설정한다. -u, —user 지정한 사용자에게 설정한다. -p, —pid 지정한 PID에게 설정한다. 예제
# PID 987과 32인 프로세스와 daemon 사용자와 root 사용자의 프로세스의 nice 값을 13으로 설정 $ renice 13 987 -u daemon root -p 32
- 현재 실행 중인 프로세스의
- nohup
- 일반적으로 시스템에서 로그아웃 시 로그아웃한 세션과 연관된 모든 프로세스에게 HUP 시그널을 보내기 때문에 관련된 모든 프로세스는 자동 종료된다.
- 하지만 nohup 사용시 해당 시그널을 가로채 무시하기 때문에 로그아웃하더라도 프로세스를 계속 실행할 수 있다.
형식
nohup command
예제
# google.com 호스트에 5번 ping을 보냄 (&를 쓰지 않아서 ping 명령이 끝나면 프롬프트로 복귀) $ nohup ping -c 5 google.com # &를 사용해 google.com 호스트에 5번 ping을 보냄 (ping은 백그라운드에서 실행됨) # 터미널이 종료되더라도 실행은 유지된다. $ nohup ping -c 5 google.com &
프로세스 검색
- pgrep
- 프로세스 이름 전체 또는 일부가 매칭되거나 특정 프로세스 속성을 기반으로 현재 실행 중인 프로세스를 검색한다.
형식
pgrep [options] [pattern]
옵션
옵션 설명 -x 패턴과 정확히 일치하는 프로세스의 PID를 출력한다. -g, -pgroup 지정한 프로세스 그룹 ID를 갖는 프로세스의 PID를 출력한다. -G, —group 지정한 프로세스 리얼 그룹 ID를 갖는 프로세스의 PID를 출력한다. -u, —euid 이펙티브 사용자 ID와 매칭하는 프로세스의 PID를 출력한다. -U, —uid 리얼 사용자 ID와 매칭하는 프로세스의 PID를 출력한다. -t, —terminal 지정한 터미널과 관련된 프로세스의 PID를 출력한다. 예제
$ pgrep -u root crond # root 사용자 중 프로세스명이 crond와 전체 혹은 일부 매칭하는 프로세스의 PID 출력 $ pgrep -x -u root cron # 사용자가 root이고 cron과 정확히 일치하는 프로세스의 PID 출력. $ pgrep -t -tty1 # tty1 터미널 관련된 프로세스의 PID 출력
☑️ 프로세스 관련 파일
/proc 디렉터리
- 설명
- 커널 내의 다양한 정보를 포함한다.
- 디스크상 존재하는 실제 디렉터리는 아니고, procfs라는 가상 파일 시스템이다.
ls
,cat
과 같은 파일 접근 명령어를 통해 프로세스, CPU, 장치, 파일 시스템 등 시스템의 정보를 조회할 수 있다.- 시스템이 부팅할 때 자동으로 procfs가
/proc
에 마운트된다. 터미널에서 직접 마운트할 수 있다.
$ mount -t proc proc /proc
- 프로세스 정보
/proc/PID
: 각 프로세스는 고유 식별자인 PID를 가지며,/proc/PID
디렉터리 이하에 프로세스의 정보를 갖는다./proc/self
:/proc
디렉터리에 접근하고 있는 현재 프로세스 정보를 확인한다.$ ls -l /proc/self # /proc/self가 PID가 3054인 프로세스 경로로 링크되었음을 확인 lrwxrwxrwx. 1 root root 64 Oct 11 14:28 /proc/self -> 3054
프로세스의 상태, 명령줄, 작업 디렉터리, 환경변수, CPU 정보, 메모리 정보 등 다양한 정보를 확인한다.
디렉터리 설명 /proc/PID/cmdline 명령줄 인자 /proc/PID/cwd 현재 프로세스의 작업 디렉터리 /proc/PID/environ 프로세스의 환경변수 /proc/PID/exe 프로세스의 실행 프로그램 /proc/PID/fd 프로세스가 가지고 있는 파일 디스크립터 /proc/PID/maps 실행 프로그램과 라이브러리 등 메모리 맵 정보 /proc/PID/mem 프로세스의 메모리 /proc/PID/root 프로세스의 루트 디렉터리 /proc/PID/stat 프로세스의 상태 /proc/PID/statm 프로세스의 메모리 상태 /proc/PID/status 프로세스의 상태(읽기 가능한) - 프로세스의 메모리 맵
- 메모리상에 실행 프로그램과 라이브러리들이 자리잡은 것
/proc/self/maps
열람 시 현재 프로세스의 메모리 맵을 확인할 수 있다.$ cat /proc/self/maps
시스템 정보
| 디렉터리 | 설명 | | — | — | | /proc/cmdline | 부팅 시 커널로드할 때 인자로 넘어온 옵션 정보 | | /proc/cpuinfo | CPU 제조사, 모델, 속도, 코어 개수 등 CPU 정보 | | /proc/devices | 현재 시스템에 로드된 디바이스 드라이버 목록 | | /proc/fb | 프레임 버퍼 정보 |
- 더 많지만 생략
☑️ 작업 예약
at
- at
- 지정한 시간에 원하는 명령을 실행한다.
- 간단한 알림 메시지, 복잡한 스크립트 등
- 시간을 함께 지정하면 at 명령어 전용 프롬프트가 보여지고 지정한 시간에 실행할 명령어나 스크립트 등을 입력할 수 있다.
- 모든 입력이 완료되면
Ctrl + D
를 입력한다. - 예약된 작업은
/var/spool/at
디렉터리에 개별 파일로 저장된다. - 실행결과는
/usr/sbin/sendmail
을 통해 메일로 전송된다. /etc/at.allow
와/etc/at.deny
환경설정 파일을 통해 at 명령어에 대한 접근제어가 가능하다.형식
at [options] time
옵션
옵션 설명 -q - 작업을 위한 큐를 지정한다.
- 큐는 a~z, A~Z 중 한 가지를 지정한다.
- 지정하지 않은 경우 기본값은 ‘a’ 큐이고 배치 작업은 ‘b’ 큐이다.
- 더 높은 글자일수록 nice 값도 올라간다.
- ‘=’ 큐는 잡을 위한 특별한 큐이다.-m 작업이 완료되면 사용자에게 메일을 발송한다. -M 사용자에게 메일을 보내지 않는다. -f 명령줄이 아닌 파일로부터 실행할 명령을 입력받는다. -l atq -l
과 동일하며 큐에 있는 모든 작업을 출력한다.-d 예약한 작업을 삭제한다. ( atrm
과 동일)- 시간지정
- 시간지정을 위한 다양한 표현식은 생략
예제
# 5:22 PM에 my-jobs.txt의 명령어가 실행되고, 출력결과는 모두 메일로 전송 $ at -m 17:22 < my-jobs.txt $ at -l # 큐의 모든 작업 출력 $ at -d 1 # 큐의 작업 삭제 OR $ atrm 1
- 지정한 시간에 원하는 명령을 실행한다.
- atq
- 현재 예약된 작업 목록을 확인한다.
at -l
과 동일하다.예제
$ atq # 현재 큐에 들어가 있는 작업 목록을 확인 # 현재 사용자 정보만 출력 # 시스템 전체 예약 작업을 확인하기 위해 루트 권한을 통해 실행 $ sudo atq
- atrm
- 예약된 작업을 삭제한다.
at -d
와 동일하다.예제
$ atrm 3 # 작업번호가 3인 예약 작업을 삭제
- 사용자 접근 제어
at
은 root 사용자만 사용할 수 있다./etc/at.allow
와/etc/at.deny
파일을 통해 일반 사용자도 사용할 수 있도록 허용하거나 차단할 수 있다.- 각 파일은 한 줄에 한 명의 사용자 이름을 입력하면 된다.
at.allow
파일에 사용자 입력시 해당 사용자만at
을 사용할 수 있다.at.deny
파일에 사용자를 기재하면 해당 사용자만at
을 사용할 수 없다.at.deny
보다at.allow
가 우선시된다.
at.deny
가 빈 파일이라면 사용자는at
을 사용할 수 있다.at.deny
에 어떤 사용자도 기재되어 있지 않아 모든 사용자가at
을 사용할 수 있다.
크론(cron)
- 설명
- 미리 정한 시간에 명령어, 프로그램, 작업 등을 실행할 수 있다.
- 매일, 매주, 매달 등 반복적으로 실행 가능하다.
- 현 시각 기준 작업을 실행해야 하는 작업이 있는지 체크하고, 작업이 있으면 이를 실행하는 크론 데몬(crond)과 예약 작업 정보가 담겨있는 설정 파일로 구성된다.
- 미리 정한 시간에 명령어, 프로그램, 작업 등을 실행할 수 있다.
- 동작 방식
- 크론 데몬은 전역 사용 목적을 위한
/etc/crontab
과 시스템 유틸리티 등 개별 패키지에 의한 작업 예약을 위한/etc/cron.d
, 개발 사용자를 위한/var/spool/cron
파일을 감시한다. - 추가로 매시간, 매일, 매주, 매달마다 작업 예약을 위한
/etc/cron.hourly
,/etc/cron.daily
,/etc/cron.weekly
,/etc/cron.monthly
파일도 존재한다.
- 크론 데몬은 전역 사용 목적을 위한
- 크론 설정 파일
- 크론 작업을 정의한다.
- 총 7개의 필드로 구성되어 있다.
- 분, 시간, 일, 월, 요일, 사용자명, 실행할 명령어 순으로 기재한다.
- minute : 0~59분 지정
- hour : 0~23시 지정
- day of month : 1일 ~31일 지정
- month : 1~12로 월을 지정하거나 jan, feb, mar, apr 등 문자열로 지정
- day of week : 0~6으로 요일을 지정. 0 또는 7은 일요일, 1은 월요일, 2는 화요일이다. sun, mon, tue, wed 등으로 지정할 수 있다.
- user-name : 사용자 이름 명시
- commnd to be executed : 실행할 명령어 지정
예제
# 매년 1월 월요일마다 23:01 PM에 backup.sh 스크립트 실행 01 23 * Monday /home/francis/backup.sh # 매일 오전 9시부터 오후 6시까지 hourly-archive.sh 스크립트 실행 00 09-18 * * * /home/carl/hourly-archive.sh # 매 토요일 오전 9시와 오후 6시 2차례에 걸쳐 script.sh 실행 0 9.18 ** Sat /home/francis/script.sh # 주간(월~금)마다 22:30PM에 backup 명령어 실행 30 22 * * Mon.Tue.Wed.Thu.Fri /usr/local/bin/backup
- crontab
- 사용자가 반복적으로 수행할 작업을 예약할 때 사용한다.
- 설정파일은
/var/spool/cron
밑에 사용자 이름으로 파일이 생성된다. 형식
crontab [options] file
옵션
옵션 설명 file 특정 파일에 설정되어 있는 내용을 크론 설정 파일에 반영한다. -u user crontab을 열람하고 수정할 수 있는 사용자를 지정한다. -l 현재 crontab 설정을 표시한다. -r 현재 crontab 설정을 제거한다. -e - crontab 설정을 편집한다.
- 환경변수 VISUAL, EDITOR에 지정되어 있는 편집기가 실행된다.예제
$ crontab -e # crontab 설정 편집 $ crontab -i # crontab 설정 표시 $ crontab -r # crontab 설정 삭제 $ crontab -e u francis # francis 사용자의 crontab 설정 편집 $ crontab mycronjob.txt # mycronjob.txt 파일에 있는 내용을 crontab에 반영
- crontab 접근제어
at
의 접근제어와 동일하다.- 기본적으로 root 사용자만 사용할 수 있다.
/etc/cron.allow
와/etc/cron.deny
파일을 통해 일반 사용자도 cron 명령어를 사용할 수 있도록 허용하거나 차단할 수 있다.- 각 파일은 한 줄에 한 명의 사용자 이름을 입력한다.