Linux
프로세스 관리
Linux 프로세스 개념, 관리 명령, 작업 제어, 작업 예약 정리
1 ) 프로세스
개요
- 현재 시스템에서 실행 중인 프로그램의 실행 단위
- 리눅스는 다중 프로세스 시스템이므로 여러 프로세스를 동시에 실행
- 프로세스는 부모-자식 관계
- systemd와 kthreadd 두 프로세스를 제외하면 모든 프로세스는 부모-자식 관계
PID
- systemd와 kthreadd 두 프로세스를 제외하면 모든 프로세스는 부모-자식 관계
- 프로세스를 식별하기 윟나 번호
- 부팅 시 systemd가 1번을 가지고 실행, kthreadd가 2번
- 유닉스에서 init이 1번이었던 것이 systemd로 변경됨
프로세스 종류
- 일반적인 프로세스 → 실행 후 자신의 작업이 끝나면 종료되는 프로세스
- Deamon Process
- 특정 서비스를 제공하기 위해 존재
- 커널에 의해 실행되기 때문에 서비스라고도 함
- 평소에는 대기 상태, 서비스 요청이 오면 서비스를 제공
- 리눅스는 다양한 서비스를 제공하기 위해 여러 데몬이 동작
- Orphen Process
- 부모 프로세스는 종료되었는데 남아있는 자식 프로세스
- 1번 프로세스가 고아 프로세스의 새로운 부모 프로세스가 되어 고아 프로세스가 작업을 마치고 종료될 수 있도록 해야 함
- 자식 프로세스는 자신의 작업을 종료하면 부모 프로세스에게 돌아가야 하는데 부모 프로세스가 없으면 종료될 수 없음
- Zombie Process
- 자식 프로세스가 종료 정보를 보내면 부모 프로세스의 프로세스 테이블 목록에서 제거되어야 하는데 프로세스 테이블 목록에 남아있는 경우 이러한 프로세스는 프로세스 목록에 defunct 프로세스로 나오게 됨
- 이러한 프로세스가 증가하며 프로세스 테이블 목록이 가득 차 정상적인 프로세스가 실행되지 않을 수 있음
- 좀비 프로세스는 kill 명령으로 제거 불가
-
2 ) 관리 명령
- 목록 확인 명령 → ps
- 현재 실행중인 프로세스에 대한 정보를 출력하는 명령
-
ps [option] - Unix Option(- 붙음)
- e → 시스템에서 실행 중인 모든 프로세스 정보 출력
- f → 자세한 정보 출력
- u uid → uid
- p pid → pid를 가진 프로세스의 정보 출력
- BSD Option(- 붙지 않음)
- a → 터미널에서 실행시킨 프로세스 정보 출력
- u → 상세 정보 출력
- x → 시스템에서 실행 중인 모든 프로세스의 정보를 출력
pgrep
- 특정 프로세스 검색
pgrep [opt] [ptrn]x→ 패턴과 정확히 일치하는 프로세스의 정보를 조회n→ 패턴을 포함하고 있는 가장 최신의 프로세스 정보를 조회u {userName}→ 사용자가 실행한 프로세스를 조회l→ PID 와 프로세스 이름을 출력t {terminalName}→ 특정 터미널과 관련된 프로세스를 조회
- 이 명령만으로는 프로세스 아이디 와 이름까지만 조회가 가능
- 자주 사용하는 방식
ps -fp $(pgrep -x bash)
프로세스 종료
- 프로세스 종료 시
kill 또는 pkill사용 - 프로세스 종료 시 상위 프로세스에게 시그널 전송 필요
- 시그널
→ 프로세스에게 무언가 발생했음을 알리는 간단한 메시지
1 SIGNHUP - 종료할 때 발생하는 시그널로 터미널과 연결이 끊긴 것 2 SIGNNT - 사용자가 CTRL+ c로 중지한 경우 3 SIGQUIT - 종료 신호로 CTRL + \ 9 SIGKILL - 강제로 종료 14 SIGALRM - 알람이 발생해서 종료 15 SIGTERM - kill 명령이 보내는 시그널 - kill 명령
kill [-시그널] PID
-
- pkill→ 프로세스 명령 이름으로 프로세스를 찾아서 종료하는 명령 -
PID는 구별하기 위한 번호이므로 한 번에 하나만 종료되지만 pkill은 이름으로 종료하기 때문에 동일한 명령으로 수행된 모든 프로세스가 종료
- killall → pkill 과 동일한 기능을 수행, 해당 프로세스를 소유해야
top
- 프로세스 정보를 주기적으로 출력
- 출력 정보
- PID → 프로세스 ID
- USER→ 프로세스 소유자
- PR→ 커널이 사용하는 실제 실행 우선순위 값
- NI → Nice 값으로 사용자가 조정하는 우선순위 값(-20 부터 19까지의 값)
- VIRT → 가상 메모리 크기
- RES → 프로세스가 사용하는 메모리 크기
- SHR → 프로세스가 사용하는 공유 메모리 크기
- %CPU → CPU 사용량
- %MEM → 메모리 사용량
- TIME+ → CPU 누적 사용 시간
- COMMAND → 명령 이름
- top 명령 수행 중 실행할 수 있는 명령
- ENTER, SPACEBAR → 새로 고침
- k → 프로세스 종료
- n → 출력하는 프로세스 개수 변경
- u → 사용자 별로 정렬
- M → 메모리 크기에 따라 정렬
- p → cpu 사용량에 따라 정렬
- q → 종료
jobs
- 백그라운드 작업을 전부 출력하는 bash의 내부 명령
- 출력방식
[작업 번호] [+는 가장 최근에 접근한 작업, -는 + 바로 직전에 접근한 작업, 공백은 그 이외의 작업] [실행 중, 완료, 종료됨, 멈춤] [명령]
- jobs [%작업번호]
작업 전환
ctrl + z→ 포그라운드 작업을 중지bg %작업번호→ 작업 번호가 지시하는 작업을 백그라운드로 전환fg %작업번호→ 작업 번호가 지시하는 작업을 포그라운드로 전환
작업 종료
- 포그라운드 작업은
Ctrl + c를 이용해서 종료 - 다른 터미널에서 해당 프로세스의
PID를조회해서 kill 이나pkill명령으로 포그라운드 작업 종료 - 백그라운드 작업도
kill명령으로 종료 가능
로그아웃 후에도 백그라운드 작업 계속 실행
nohup 명령 &
3 ) 작업 예약
- 정해진 시간에 한 번만 실행 → at
sudo apt install at - 현재 실행 대기 중인 명령의 전체 목록 →
l - 현재 실행 대기 중인 명령 중 해당 작업 번호를 삭제 →
r {작업번호} - 출력 결과가 없더라도 작업이 완료되면 사용자에게 메일로 알림 →
m - 표준 입력 대신 실행할 명령을 파일로 지정 →
-f {파일}- script 파일을 만들어 파일의 내용을 수행함
- 정확한 날짜 및 시간 지정
→
t [CC]YY]MMDDHHMM[.ss] - 예약된 작업 내용 확인 →
c {작업번호} - 실행의 우선 순위를 지정
→
-q <Queue>- 지정하는 값은
a ~ Z, A ~ Z이며, 기본값은 a
- 지정하는 값은
- 시간 설정
- 절대 시간
at 14:30at 2026-01-10 03:00
- 상대 시간
at 4pm + 3daysat 10am Jul 31at 1am tomorrowat 10:00am todayat now + 10minutes
- 요일 지정
at 10am next Monday
- 절대 시간
-
작업 확인 -
sudo ls -l /var/spool/cron/atjobs → 파일 확인-at -l-atq -
작업 예약(작성 후 종료는
Ctrl+d) - 사용제한
- 시스템 관리자는
/etcat.allow파일과etc/at.deny파일을 이용해서 사용 제한 가능 - allow 파일에는 사용 가능한 계정 작성,
- deny 파일에는 사용 불가능한 계정 작성
- allow 파일을 확인해서 계정이 있으면 deny는 무시
- allow 파일이 없으면 deny 파일에 존재하지 않는 계정 전부 사용 가능
- 2개의 파일이 모두 없다면 root만 사용 가능
- 초기 설정 → deny는 있지만 비어있음
- 시스템 관리자는
- 정해진 시간에 반복 실행 → crontab
crontab [-u {user}] [opt] [fileName]- Option
- 사용자의 crontab 파일 수정 →
e - crontab 파일의 목록을 출력 →
l - crontab 파일을 삭제 →
r
- 사용자의 crontab 파일 수정 →
- crontab 파일은 사용자 별로 생성됨 → 이 파일에 반복 실행할 내용 저장
- 여러 개의 작업을 지정 가능
- 한 행에 하나씩 작업 설정
- 작업 설정
- 분(0~59) 시(0~23) 월(1~12) 요일(0~6) 작업내용
- 각 항목은 공백으로 구분
- 항목의 값이
*이면 해당 항목의 모든 값을 의미 - 범위 지정 가능(요일 필드에 1-5면 월~금) →
- - 여러개 값 지정 가능(시간 필드에 1, 3, 5면 1시 3시 5시) →
, - 단계 값 지정할 때 사용 가능(1-10/2 → 1, 3, 5, 7, 9가 되며 분 필드가
*/20이면 20분마다) →/
# 매일 11시 30분에 ls -al / 의 결과를 crontab.out에 기록
30 1 * * * /usr/bin/ls -al / > /home/kkr010128/crontab.out
# 실습1. at 명령으로 현재 시간보다 5분 후 ls -l /tmp > ~/at.tmp 명령을 수행
# 실습2. crontab 명령으로 매주 일요일 18시에 ~/ 의 내용을 출력해 ~/ 아래에 weekout 파일로 저장하도록 설정
댓글