본문 바로가기

13. OS

[Linux] 4. 프로세스 관리하기

https://www.yes24.com/Product/Goods/56681458

 

페도라 리눅스 - 예스24

시스템, 서버 및 네트워크, 보안까지 한 권으로 정복하는 페도라 리눅스리눅스에 대한 기본 지식을 쌓고자 하는 컴퓨터 관련 학과 학생을 대상으로 한다. 대부분의 윈도 사용자를 위해 리눅스를

www.yes24.com

 

◎ 프로세스의 개념

프로세스는 현재 실행 중인 프로그램을 뜻한다. 리눅스의 운영에 필요한 다양한 기능을 수행하는 시스템 프로세스도 있고, 사용자가 실행한 프로그램인 사용자 프로세스도 있다.

 

 

리눅스에서 모든 프로세스는 부모-자식 관계를 가지고 있다. 필요에 따라 부모 프로세스는 자식 프로세스를 생성하고, 자식 프로세스는 또 다른 자식 프로세스를 만들 수 있다. 

부모 프로세스와 자식 프로세스의 관계

 

각 프로세스는 고유한 번호를 가지고 있는데 이를 PID(Process Identification number)라고 한다.

PID는 1번부터 시작하고 프로세스가 실행되면서 하나씩 증가하여 부여된다. 리눅스가 부팅될 때 PID 1번 systemd 프로세스와 2번 kthreadd 프로세스가 차례로 실행된다.

 

PID 1 : 시스템의 init 프로세스를 나타낸다. init 프로세스는 시스템 부팅 시 가장 먼저 시작되며, 다른 모든 프로세스의 부모가 된다. CentOS 7에서는 systemd가 init 프로세스를 대체하고 있으므로, 보통 PID 1은 systemd 프로세스를 가리킨다.

PID 2 : PID 1 이후에는 커널이나 시스템 초기화를 위한 프로세스들이 실행된다. PID 2는 일반적으로 커널 스레드(kernel thread)인 kthreadd를 나타낸다. kthreadd는 커널의 기능을 수행하며, 다른 스레드와 프로세스들의 생성을 관리한다.

 

 

ㆍ데몬 프로세스 (Daemon Process) 

 특정 서비스를 제공하기 위해 존재하며 리눅스 커널에 의해 실행된다. 데몬은 평소에는 대기 상태로 있다가 서비스 요청이 들어오면 서비스를 제공한다.

 

ㆍ고아 프로세스 (Orphan Process)

 자식 프로세스는 종료되면 부모 프로세스로 돌아간다. 그러나 자식 프로세스가 아직 실행 중인데 부모 프로세스가 먼저 종료되면 자식 프로세스는 고아 프로세스가 된다. 이 경우 1번 프로세스가 이런 고아 프로세스의 새로운 부모 프로세스가 되어 고아 프로세스가 작업을 마치고 종료될 수 있게 한다.

 

ㆍ좀비 프로세스 (Zombie Process)

 자식 프로세스는 종료될 때 부모 프로세스에 종료 정보(exit status)를 보내고 부모 프로세스가 이 정보를 받으면 자식 프로세스는 프로세스 테이블 목록에서 삭제된다. 하지만 자식 프로세스가 실행을 종료했는데도 프로세스 테이블 목록에 남아 있는 경우가 있는데 이를 좀비 프로세스라고 한다. 부모 프로세스가 자식 프로세스의 종료 정보를 제대로 처리하지 않았기 때문에 이런 일이 발생한다. 좀비 프로세스는 프로세스 목록에 defunct 프로세스 라고 나오기도 한다. 실제로 실행되지는 않지만 동작 중인 프로세스 테이블 목록을 차지 하고 있기 때문에 일반 프로세스의 실행을 방해하는 문제가 발생할 수 있다.

 

top으로 개수 파악이 가능하다.

ps -ef | grep defunct | grep -v grep
ps aux | egrep "Z|defunct"

 

 

◎ 프로세스 관리 명령

현재 실행 중인 프로세스 목록을 보는 명령은 ps이다. ps 명령을 옵션 없이 사용하면 현재 셸이나 터미널에서 실행한 사용자의 프로세스의 정보를 출력한다.

상세한 정보를 보여주는 -f 옵션

항목 의미
UID  프로세스를 실행한 사용자 ID
PID 프로세스 번호
PPID  부모 프로세스 번호
C CPU 사용량 (%값)
STIME  프로세스의 시작 날짜나 시간
TTY  프로세스가 실행된 현재 터미널의 종류나 번호
?로 나타나는 경우는 해당 프로세스가 어떤 터미널에도 연결되어 있지 않음을 나타낸다.
(ex. 시스템 서비스, 데몬, 원격으로 실행되는 프로세스 등)
TIME  해당 프로세스가 사용한 CPU 시간의 양 (프로세스 실행 시간)
CMD  실행되고 있는 프로그램 이름(명령)

 

 

터미널에서 실행한 프로세스의 정보를 출력하고 싶다면 a 옵션을 주면 된다.

 

출력 내용 중 STAT는 프로세스의 상태를 나타낸다.

문자 의미
R (Running) 실행 중인 프로세스
S (Sleeping) 실행 대기 중 이거나 Sleep 모드
T (Stopped) 정지 된 상태. 주로 시그널을 받아(작업 제어) 정지된 상태이다.
N (Low-Priority) 높은 우선순위가 아닌, 낮은 우선순위의 프로세스
Z (Zombie) 좀비 프로세스 (defunct)
s (Session Leader) 터미널 세션의 제어를 담당하는 프로세스
+ (Foreground, High-Priority) 포그라운드 프로세스 그룹
l (소문자 L) 멀티스레드

 

포그라운드 프로세스에 대해서는 밑에서 다시 정리.

 

 

ㆍ시그널 (signal)

프로세스에 무언가 발생했음을 알리는 간단한 메세지이다. 이 메세지에는 무엇이 발생했는지를 나타내는 미리 정의된 상수를 사용한다. 시그널은 번호로 구분되며 이름을 가지고 있다. 

 

리눅스에서 지원하는 시그널의 목록을 보는 kill -l

 

주로 사용되는 것은 다음과 같다.

시그널 번호 의미
SIGINT 2 키보드 인터럽트를 나타내며, 주로 Ctrl+C를 사용하여 프로그램을 중지하는 데 사용된다.
SIGTERM 15 프로그램에게 정상적으로 종료하라는 신호를 보낸다.
옵션 없이 kill 명령어를 사용할 때. (kill PID)
SIGKILL 9 프로세스를 강제로 종료하는 신호를 보낸다.
해당 프로세스가 사용 중인 메모리나 리소스를 정리하지 않고 직접 종료된다.
SIGSTOP 19 프로세스를 일시 중지하는 신호이다.
해당 프로세스가 실행 중인 모든 작업이 일시 중지된다.
SIGCONT 18 중지된 프로세스를 다시 실행하는 신호이다.

 

 

kill 명령으로 인자를 지정하여 프로세스에 시그널을 전달한다.

 

● kill [-시그널] PID

지정한 시그널을 프로세스에 보낸다.

 

ex) kill -9 10402 / kill 1004

 

pkill 명령은 PID가 아닌 프로세스의 명령 이름(CMD)으로 프로세스를 찾아서 종료한다.

kill 명령과 차이점은 같은 명령이 여러 개 검색될 경우 한 번에 모두 종료한다.

예시

자신이 소유한 프로세스만 종료할 수도 있다.

 

ps 명령으로는 현재 프로세스 목록을 확인만 할 수 있다. top 명령은 현재 실행 중인 프로세스의 정보를 주기적으로 출력하는데, 프로세스의 자세한 요약 정보를 상단에 출력하고 각 프로세스의 정보를 하단에 출력한다.

명령어 top

 

위에서부터 6개 항목을 쪼개서 나타내었다.

 

항목 의미
top - 현재시간 현재 시간
up (업타임 정보) 시스템이 부팅된 이후의 시간을 나타낸다.
users (사용자 수) 현재 시스템에 로그인한 사용자 수를 나타낸다.
load average (부하 평균) 일정 시간 동안의 시스템 부하를 나타내는 값이다.
이 값은 보통 1분, 5분, 15분 동안의 평균 부하를 순서대로 나타낸다.

 

load average는 시스템과 작업의 특성에 따라 다를 수 있지만 일반적인 기준은 이렇다.

 

1.0 미만 : 시스템이 현재의 작업 부하를 처리하기에 충분한 여유가 있음을 나타낸다. 이러한 경우 시스템은 대부분의 경우 정상적으로 작동한다.

1.0 이상 : 시스템이 현재의 작업 부하를 처리하기에는 조금 더 부하가 높은 상태에 있음을 나타낸다. 일부 작업이 대기 중이거나 실행 중일 수 있지만 대부분의 시스템은 작동한다. 그러나 부하가 지속적으로 높으면 시스템의 응답성이 저하된다.

5.0 이상 : 시스템이 현재의 작업 부하를 처리하기에 매우 부하가 높은 상태에 있음을 나타낸다. 이 경우 시스템은 많은 수의 작업을 처리하고 대부분의 리소스가 사용 중이다. 시스템이 느려질 수 있고, 대기 중인 작업이 많아진다.

10.0 이상 : 시스템이 매우 과부하되었음을 나타낸다. 시스템이 매우 느려지고 대기 중인 작업이 많을 것으로 예상된다. 이러한 상황에서는 시스템의 리소스 사용을 최적화하는 등의 조치가 필요하다.

 

 

항목 의미
Total 현재 시스템에 있는 총 프로세스 수
Running 현재 실행 중인 프로세스 수
Sleeping 실행 대기중이거나 Sleep 모드에 있는 프로세스 수
Stopped 중지된 프로세스 수
Zombie 종료되었지만 부모 프로세스가 상태를 확인하지 않은 프로세스 수

 

 

항목 의미
us (user) 사용자 모드에서 CPU가 소비한 시간
sy (system) 시스템 모드에서 CPU가 소비한 시간
ni (nice) 나이스 값에 해당하는 프로세스가 사용한 CPU 시간
id (idle) CPU가 아무 작업을 수행하지 않고 대기한 시간
이 값은 CPU가 유휴 상태인지를 나타낸다.
wa (wait) CPU가 I/O 작업을 기다리는 시간 (waiting)
(CPU가 I/O 작업이 완료될 때까지 대기하는 시간)
hi (hardware interrupt) 하드웨어 인터럽트로 발생한 CPU 사용 시간
si (software interrupt) 소프트웨어 인터럽트로 발생한 CPU 사용 시간
st (Steal Time) 가상 머신이 호스트 시스템의 CPU를 사용하기 위해 대기하는 시간

 

사용자 모드 : 사용자 프로그램이 CPU를 사용하는 모드

시스템 모드 : 커널이 시스템 서비스를 처리하는 모드

하드웨어 인터럽트 : 하드웨어 장치(네트워크 카드, 디스크 컨트롤러 등)에서 발생한 인터럽트를 의미

소프트웨어 인터럽트 : 커널에서 발생한 인터럽트를 의미

스틸 타임 부가 설명 :  하나의 물리 장비에 여러대의 가상머신을 돌릴 경우 특정 머신이 CPU을 많이 차지하면 나머지의 머신은 느려질 수 밖에 없다. 가상 머신이 CPU를 요청하였지만 호스트 시스템이 다른 가상 머신에게 CPU를 할당하였거나 우선 순위가 상대적으로 낮다거나 하여 기다리는 시간이 길어질수록 스틸 시간은 증가.

 

 

항목 의미
Total 시스템의 총 물리적 메모리(RAM) 용량
Used 현재 사용 중인 메모리 양
Free 여유 메모리 양
Buff/ Cache 버퍼, 캐시로 사용되는 메모리 양

 

 

항목 의미
Total 시스템의 총 스왑 메모리 용량
Used 사용 중인 스왑 메모리 양
Free 여유 스왑 메모리 양
avail Mem 현재 사용 가능한 물리적인 메모리(RAM) 양

 

Swap 메모리 : 주 메모리(RAM)가 부족한 경우에 사용되는 보조 메모리.

시스템이 물리적인 RAM을 모두 사용하게 되면, 사용되지 않는 메모리 페이지를 디스크의 스왑 공간에 저장하고, 필요할 때 다시 불러와 메모리에 적재한다.

 

 

항목 의미
PID (Process ID) 프로세스 고유 ID
USER 프로세스를 실행한 사용자의 이름
PR (Priority) 프로세스의 우선 순위
NI (Nice value) 프로세스의 nice 값
CPU 스케줄링에 영향을 미치는 값으로, 낮은 값일수록 우선 순위가 높다.
VIRT (Virtual Memory) 프로세스가 사용 중인 가상 메모리의 크기
RES (Resident Memory) 프로세스가 실제로 사용 중인 물리적 메모리의 크기
SHR (Shared Memory) 프로세스가 공유 메모리를 사용 중인 경우의 크기
S (State) 프로세스의 상태
S (sleeping), R (running), Z (zombie) 등이 있다.
%CPU (CPU usage) CPU 사용량 %로 표시
%MEM (Memory usage) 메모리 사용량 %로 표시
TIME+ (CPU Time) 부팅 후 프로세스가 CPU를 사용한 시간
COMMAND 프로세스를 실행한 명령어 또는 프로그램 이름

 

 

사용자가 터미널에서 작업할 때 보통의 경우 한 번에 하나의 프로세스만 실행할 수 있다. 어떤 명령을 실행하면 명령이 끝날 때까지 기다려야 다시 터미널을 사용할 수 있다. 그런데 사용자가 어떤 프로세스를 실행하면서 동시에 다른 프로세스를 실행해야 할 때가 있다. 작업 제어(job control) 도구는 이렇게 한 터미널에서 동시에 여러 프로세스를 실행하고 관리하기 위해 개발되었다.

 

 

◎ 포그라운드, 백그라운드 프로세스와 작업 제어

ㆍ포그라운드 작업 (Foreground Task)

 사용자가 입력한 명령이 실행되어 결과가 출력될 때 까지 사용자가 해당 과정을 직접 관찰하고 있으며 그에 따라 진행되는 작업이다. 일반적으로 사용자가 명령을 실행하는 방식으로, 프롬프트가 출력되지 않아 다른 명령을 입력할 수 없으므로 기다려야 한다.

프롬프트가 출력되지 않는다.

 

 

백그라운드 작업 (Background Task)

  작업 제어가 제공하는 백그라운드 기능을 사용하면 앞에서(foreground) 프로세스가 실행되는 동안에 뒤에서(background) 다른 프로세스가 실행될 수 있으므로 한 터미널에서 여러 개의 프로세스를 동시에 실행할 수 있다. 백그라운드 방식으로 명령을 실행하면 명령의 처리가 끝나는 것과 관계없이 곧바로 프롬프트가 출력되어 사용자가 다른 작업을 계속할 수 있다.  명령을 백그라운드로 실행하려면 명령의 마지막에 &(앰퍼샌드) 기호를 추가한다.

 

현재 실행 중인 백그라운드 작업을 보는 명령은 jobs 이다.

 

  jobs

백그라운드 작업을 모두 보여준다. 특정 작업 번호를 지정하면 해당 작업의 정보만 보여준다.

 

%번호 : 해당 번호의 작업 번호를 출력한다.

%+ 또는 %% : 작업 순서가 +인 작업 정보를 출력한다.

%- : 작업 순서가 -인 작업 정보를 출력한다.

 

ex)

jobs / jbos %1

jobs %1 치면 번호에 해당하는 작업만 나온다.

항목 출력 예 의미
작업 번호 [1] 작업 번호로서 백그라운드로 실행할 때마다 순차적으로 증가한다.
작업 순서 + 작업 순서를 표시한다.
+ : 가장 최근에 접근한 작업
- : + 작업보다 바로 전에 접근한 작업
공백 : 그 외의 작업
상태 Running 작업 상태를 표시한다.
Running : 현재 실행 중이다.
Done : 작업이 정상적으로 완료되었다.
Terminated : 작업이 비정상적으로 종료되었다.
Stopped : 작업이 잠시 정시중이다.
명령 sleep 50 & 백그라운드로 실행 중인 명령이다.

 

 

작업 전환과 관련된 명령은 다음과 같다.

명령 기능
Ctrl + z 또는 stop %작업번호 포그라운드 작업을 중지한다. (종료가 아닌 잠시 중단)
bg %작업 번호 작업 번호가 지시하는 작업을 백그라운드 작업으로 전환한다.
fg %작업 번호 작업 번호가 지시하는 작업을 포그라운드 작업으로 전환한다.

 

예시

백그라운드 작업을 실행한 터미널이 종료되거나 사용자가 로그아웃하면 실행 중이던 백그라운드 작업도 함께 종료된다. 그런데 로그아웃한 다음에도 작업이 완료될 때까지 백그라운드 작업을 실행해야 할 경우가 있다. 이때 nohup 명령을 사용한다.

 

  nohup

로그아웃한 후에도 백그라운드 작업을 계속 실행한다.

 

ex)

nohup 명령&

 

명령을 할 때 출력 방향을 따로 지정하지 않으면 nohup.out 파일로 생성이 된다.

예시

재시작의 경우가 궁금하면 sleep을 걸고 재시작 해보면 확인할 수 있다.

 

 

시스템을 사용하다 보면 주기적으로 반복해야 하는 작업이 있다. 이럴 때 작업 예약을 사용하면 잊지 않고 필요한 작업을 수행하고 효율적으로 업무를 처리할 수 있다. 정해진 시간에 한 번만 수행하는 것과 반복 수행하는 기능을 제공한다. 

 

정해진 시간에 한 번만 명령을 실행하려면 at 명령을 사용한다.

 

  at

예약한 명령을 정해진 시간에 실행한다.

 

ㆍ옵션

-l : 현재 실행 대기 중인 명령의 전체 목록을 출력한다. (atq 명령과 동일)

-r 작업 번호: 현재 실행 대기 중인 명령 중 해당 작업 번호를 삭제한다. (atrm과 동일)

-m : 출력 결과가 없더라고 작업이 완료되면 사용자에게 메일로 알려준다.

-f 파일 : 표준 입력 대신 실행할 명령을 파일로 지정한다. 

 

ex)

at 10:00 pm

at 8:15 am May 30

at -m 0730 tomorrow

내일 파일이 생성 되는지 확인해보자.
잘 생성되었다.

 

at 명령을 정확히 입력 했다면 프롬프트가 at>로 바뀌고 실행할 명령들을 입력하고 Ctrl + D를 누르면 화면에 는 <EOT>로 출력된다. at로 설정한 작업 결과는 지정된 파일에 저장 된다. 작업 파일은 /var/spool/at 디렉토리에 저장된다.

 

설정된 작업의 목록은 at 명령의 -l 옵션과 atq 명령으로 확인이 가능하다. 

  atq

현재 사용자의 등록된 작업 목록을 보여준다. 슈퍼유저일 경우 모든 사용자의 작업 목록을 보여준다.

 

 

설정한 작업이 실행되기 전에 삭제하려면 at 명령의 -d 옵션과 atrm 명령으로 가능하다.

  atrm

지정된 작업 번호의 작업을 삭제한다.

 

ex)

atrm 작업번호

 

시스템 관리자는 일반 사용자들이 at 명령을 사용하도록 허용하거나 사용하지 못하도록 제한할 수 있다.  ㆍ/etc/at.allow

at 명령의 사용을 허용할 사용자들을 지정하는 파일.

 

/etc/at.deny

at 명령의 사용을 금지할 사용자들을 지정하는 파일.

 

at.deny 파일은 기본적으로 있지만 at.allow 파일은 없으므로 필요시에 관리자가 만들어야 한다.

계정을 입력해두면 at 명령 사용이 금지된다.

 

두 파일의 적용 기준은 다음과 같다.

ㆍallow 파일이 있다면 이 파일에 지정된 사용자만 at 명령을 사용할 수 있다. deny 파일은 무시된다.

(사용자가 두 파일에 모두 속해 있다면 at 명령을 쓸 수 있다)

ㆍallow 파일이 없다면 deny 파일에 지정된 사용자를 제외한 모든 사용자가 at 명령을 사용할 수 있다.

ㆍ두 파일이 모두 없다면 root만 at 명령을 사용할 수 있다.

ㆍdeny 파일을 빈 파일로 두면 모든 사용자가 at 명령을 사용할 수 있다. (default)

 

 

정해진 시간에 명령을 주기적으로 반복해서 실행하려면 crontab 명령을 사용하면 된다.

 

  crontab

사용자의 crontab 파일을 관리한다.

 

ㆍ옵션

-l : crontab 파일의 목록을 출력한다.

-e : 사용자의 crontab 파일을 편집한다.

-r : crontab 파일을 삭제한다.

 

ex)

crontab -l

crontab -u kdk -e

crontab -r

 

crontab 명령으로 관리하는 파일은 사용자별로 생성되는데 이 파일에 반복 실행할 작업이 저장 된다. 여러 개의 작업을 저장할 수 있으며 한 행에 하나의 작업을 설정한다.

분(0~59 시(0~23) 일(1~31) 월(1~12) 요일(0~6) 작업내용

 

30 23 1 * * -ls alh /tmp > /home/kdk/tmplogs

매월 1일 23시 30분에 작업 내용 실행

예시

-e 옵션을 주면 명령을 편집할 수 있는 편집기가 나온다. 편집한 내용을 저장하면 /var/spool/cron 경로에 사용자 계정 이름으로 파일이 생긴것을 확인할 수 있다.

-l 옵션으로 현재 사용자의 crontab 파일의 내용이 출력되는 것을 확인할 수 있다.

-r 옵션으로 crontab 파일을 삭제할 수 있다. 관리자 권한인 경우 crontab -u [username] -r 이런식으로 삭제할 사용자의 이름도 같이 입력해줘야 한다.

 

at과 마찬가지로 crontab도 명령 사용 권한을 제한할 수 있다.

/etc/cron.allow

/etc/cron.deny

 

at과 마찬가지로 두 파일 적용 기준은 비슷하다.

 

'13. OS' 카테고리의 다른 글

[Linux] 6. 리눅스 시스템의 부팅과 종료  (0) 2024.04.02
[Linux] 5. 파일 시스템과 디스크 관리  (1) 2024.03.28
[Linux] 3. 파일의 접근 권한  (0) 2024.03.18
[Linux] 2. shell  (1) 2024.03.18
[Linux] 1. 디렉토리와 파일  (0) 2024.03.14