컴퓨터공학부

[시스템 프로그래밍 Linux] 프로세스 관리

혜머니 2026. 4. 15. 21:46

1. 프로세스 관리

 (1) 프로세스의 개념

  - 프로세스 : 현재 시스템에서 실행 중인 프로그램 

  - 부모 프로세스는 필요에 따라 자식 프로세스를 생성하며, 자식 프로세스는 또 다른 자식 프로세스를 만들 수 있음

  - 모든 프로세스는 부모 프로세스를 가지고 있음 (리눅스 시스템 부팅 시 스케쥴러가 실행한 프로세스인 systemd(1)과 kthread(2) 프로세스 제외)

  - 자식 프로세스 : 부모 프로세스에 의해 만들어지는 프로세스로 할 일이 끝나면 부모 프로세스에 결과를 돌려주고 종료됨

  - PID : 각 프로세스는 고유 번호를 가짐, 1번부터 시작하고 프로세스가 실행되면서 하나씩 증가하여 부여

  - 리눅스가 부팅될 때 1번은 systemd, 2번은 kthread가 할당됨

  - 1번 프로세스(systemd)는 나머지 모든 시스템 프로세스의 부모 프로세스

  - 2번 프로세스(kthread)는 나머지 모든 스레드의 부모 프로세스

  - init 프로세스 : 전통적인 유닉스의 1번 프로세스 (로키 리눅스에서 1번 프로세스는 systemd로 init의 역할 대체), systemd와 init는 호환성이 유지함

  - 데몬 프로세스 : 특정 서비스를 제공하기 위해 존재, 평소 대기하고있다가 서비스 요청이 들어오면 서비스를 제공함, 리눅스에서 다양한 서비스를 제공하기 위해 데몬이 동작

  - 고아 프로세스 : 자식 프로세스가 아직 실행 중인데 부모 프로세스가 먼저 종료되면 자식 프로세스는 고아 프로세스가 됨

    > 1번 프로세스가 이런 고아 프로세스의 새로운 부모 프로세스가 되어 고아 프로세스가 작업을 마치고 종료할 수 있게 함

  - 좀비 프로세스 :자식 프로세스가 종료했는데도 프로세스 테이블 목록에 남는 경우, 자식 프로세스 종료 정보를 부모 프로세스가 읽어가기를 기다리는 것, 부모 프로세스 처리 이상

    > 좀비 프로세스는 실제로 실행되지 않지만 동작중인 프로세스 테이블 목록을 차지하고있음

    > 좀비 프로세스가 증가하면 프로세스 테이블 용량이 부족해져 정상적인 프로세스 실행이 되지 않을 수 있음

   - 좀비 프로세스는 kill 명령으로 제거할 수 없음

   - SIGCHLD 시그널을 부모 프로세스에 보내어 부모 프로세스가 자식 프로세스를 정리하도록 함 혹은 부모 프로세스 자체를 종료함

  - 부모 프로세스가 종료되면 좀비 프로세스는 고아 프로세스가 되고, 1번 프로세스가 주기적으로 자식 프로세스의 종료 정보를 확인하여 정리함

2. 프로세스 관리 명령

 (1) 프로세스 명령 확인  == ps

  -현재 실행 중인 프로세스에 대한 정보를 출력함

  - ps [옵션] 

  * -e 시스템에서 실행중인 모든 프로세스 정보 출력

  * -f 프로세스에 대한 자세한 정보 출력

  * -u uid 특정 사용자에 대한 모든 프로세스의 정보를 출력함

  * -p pid pid로 지정한 특정 프로세스 정보를 출력함

  < BSD 옵션 >

  * a 터미널에서 실행시킨 프로세스의 정보를 출력함

  * u 프로세스 소유자 이름, CPU 사용량, 메모리 사용량 등 상세 정보 출력

  * x 시스템에서 실행 중인 모든 프로세스 정보를 출력함

  < GNU 옵션 > 

  * --pid PID 목록 목록으로 지정한 특정 PID 정보를 출력함

  - 사용 예시 ps / ps -ef / ps aux

  - ps 명령이 출력하는 PID를 통해 프로세스의 부모-자식 관계도 확인 가능

  - 세가지 유형 섞어서 사용할 수 있으나 충돌 발생 가능 > 자신에 필요한 정보를 제공하는 옵션 조합을 찾아야함

  - 프로세스는 시스템이 직접 실행하거나 특정 터미널에서 실행됨

  - ps 명령을 옵션 없이 사용하면 현재 셸이나 터미널에서 실행한 사용자 프로세스 정보 출력

  - TTY는 형재 터미널 번호, TIME은 해당 프로세스가 사용한 CPU 시간의 양

  - CMS는 프로세스가 실행 중인 명령이 무엇인지를 알려줌

PID     TTY    TIME      CMD
38475  pst/1  00:00:00  bash
== bash는 터미널 1번에서 실행 중이고, PID가 38475번임 PID는 시스템별로 다르게 나타남

  - -f 옵션은 프로세스의 상세한 정보를 출력함

ps -f
UID    PID     PPID     C   STIME   TTY    TIME      CMD
user1  38475  38762   0    16:11     pst/1  00:00:00  bash
== STIME=STARTTIME, C(CPU 사용량 %값), PPID 부모 프로세스 번호

  - BSD 옵션인 a 옵션도 터미널에서 실행시킨 프로세스의 정보를 출력함

ps a
PID   TTY STAT TIME COMMAND
2072  tty2 Ssl+   0:00   /usr//lebexec/gdm-wayland...
== 콘솔 터미널(tty)과 가상 터미널(pts/0, pts/1)에서 실행시킨 프로세스 정보를 출력한 것

  - STAT는 프로세스 상태를 나타냄

문자 의미 문자 의미
R 실행 중(Running) %CPU 퍼센트로 표시한 CPU 사용량
S 인터업트가 가능한 대기(Sleep) 상태 %MEM 퍼센트로 표시한 물리적 메모리 사용량
T 작업 제어에 의해 정지된 상태 VSG 사용 중인 가상 메모리의 크기(KB)
Z 좀비 프로세스(Default) RSS 사용 중인 물리적 메모리 크기(KB)
STIME 프로세스 시작 날짜나 시간 START 프로세스 시작 시간
S 세션 리더 프로세스    
+ 포그라운드 프로세스 그룹    
l 멀티스레드    

  - a옵션과 u옵션을 함께 사용하면 터미널에서 실행한 프로세스의 상세 정보를 출력함

  > a옵션이랑 -f 옵션을 사용한 것과 비교해보면 CPU

  - -e옵션은 시스템에서 실행 중인 모든 프로세스를 출력함

   > TTY값이 ?인 것은 대부분이 데몬으로 시스템이 실행한 프로세스

   > 출력 결과를 페이지 단위로 확인하려면 |, more, less 명령을 함께 사용해야 함

  - 전체 프로세스의 더 자세한 정보를 확인하려면 -e옵션과 -f옵션을 함께 사용해야 함 == -ef

   > TTY가 ?인 프로세스는 사용자 ID가 root, 스레드는 CMD에 []로 표시하여 구분함

   - ax 옵션 -e옵션과 마찬가지로 시스템에서 실행중인 모든 프로세스 출력

 (2) 특정 프로세스 목록, 정보의 출력과 검색

  - -u 옵션을 사용하면 특정 사용자가 실행한 프로세스 목록 확인 가능

  - -p 특정 PID의 프로세스의 정보를 출력을 위한 옵션 *-f 함께 사용하는 것이 좋음

  - ps 명령과 grep(검색 명령)을 |로 연결하여 특정 프로세스 정보 검색 가능 ps -ef | grep bash(이름 검색)

  - pgrep 명령은 ps와 grep을 하나로 통합한 명령임

   * 기본적인 인자로 지정한 패턴과 일치하는 프로세스를 찾아 PID를 알려줌, 옵션의 지정에 따라 검색 내용이 달라짐

  ⓐ pgrep : 지정한 패턴과 일치하는 프로세스 정보를 출력함

   - pgrep [옵션] [패턴] 

   - 옵션 : -x 패턴과 정확하게 일치하는 프로세스 정보를 찾기, -n 패턴을 포함하고 있는 가장 최근 프로세스 정보 출력

               -u 사용자이름 특정 사용자에 대한 모든 프로세스, -l PID와 프로세스 이름 출력

               -t term 특정 단말기와 관련된 프로세스 정보 출력

   - 더 자세한 정보검색은 pgrep 명령을 ps 명령과 함께 사용해야 함

ps -fp $(pgrep -x bash) >> 이름이 bash인 모든 프로세스 내용 출력

 (3) 프로세스 강제 종료

  - 응답이 없는 프로세스나 불필요한 프로세스를 강제 종료하여면 해당 프로세스의 PID를 알아야 함

  - ps -ef나 ps aux 명령으로 프로세스의 정보를 확인함 (PID/PPID)

  - 프로세스를 종료하려면 kill이나 pkill 명령을 사용함 > 프로세스에 시그널을 보내 종료

  - 시그널 : 프로세스에 무언가 발생했음을 알리는 간단한 메세지, 미리 정의된 상수 사용, 번호로 구분되며 이름을 가짐

  - 시그널을 받은 프로세스는 기본적으로 종료됨, 리눅스에서 지원하는 시그널 목록은 kill -l 명령으로 알 수 있음

번호시그널 이름의미기본 동작프로그램에서 처리 가능?보통 언제 쓰는지

1 SIGHUP 터미널 연결 끊김,
설정 다시 읽기 용도로도 자주 사용
종료 가능 데몬 프로세스에 설정 재적용 요청할 때
2 SIGINT 인터럽트 신호 종료 가능 터미널에서 Ctrl + C 눌렀을 때
3 SIGQUIT 종료 + 코어 덤프 종료
+core 생성
가능 강제 종료하면서 디버깅 정보도 남기고 싶을 때
9 SIGKILL 즉시 강제 종료 무조건 종료 불가능 정말 안 죽는 프로세스를 강제로 죽일 때
좀비 프로세스의 경우 종료되지 않을 수 있음
14 SIGALRM 타이머 알람 신호 종료 가능 alarm() 같은 타이머 만료 시
15 SIGTERM 정상 종료 요청 종료 가능 kill PID 기본값, 가장 일반적인 종료 요청
프로세스와 관련된 파일들의 정리 및 종료
종료되지 않는 프로세스가 있을 수 있음
> 시그널을 무시하거나 다른 동작을 하도록 지정되어있는 프로세스가 있다면

 ⓑ kill 명령 : 지정한 시그널을 프로세스에게 보냄

  - kill [-시그널] PID...

  - 시그널은 상위 표 참조

  - 프로세스는 시그널을 받았을 때 어떻게 처리할 것인지 동작이 지정되어 있음

  ⓒ pkill : 프로세스 종료 명령 >> PID가 아니라 프로세스의 명령 이름으로 프로세스를 찾아 종료함

  - kill과 차이점 : 같은 명령이 여러개 검색되면 여러 프로세스를 한번에 종료 가능, 자신이 소유한 프로세스만 종료도 가능

  ⓓ killall : 프로세스(CMD) 이름으로 프로세스를 찾아 종료함

 (4) top 명령과 시스템 정보

  - 현재 실행 중인 프로세스의 정보를 주기적으로 출력

  - 프로세스의 자세한 요약 정보를 상단에 출력

  - 각 프로세스의 정보를 하단에 출력

항목 의미 항목 의미
PID 프로세스 ID SHR 프로세스가 사용하는 공유 메모리 크기
USER 사용자 계정 %CPU % CPU 사용량
PR 우선 순위 %MEM % MEMORY사용량
NI Nice 값 TIME+ CPU 누적 이용 시간
VIRT 프로세스가 사용하는 가상 메모리 크기 COMMAND 명령 이름
RES 프로세스가 사용하는 메모리 크기    

 - top 명령 중 종료하지 않고 실시간으로 프로세스 상태를 보여주고 내부적으로 사용하는 명령도 있음

내부 명령 기능 내부 명령 기능
[Enter]
[Backspace]
화면을 즉시 다시 출력 h
?
도움말 화면 출력
k 프로세스 종료, 종료한 프로세스 PID 확인 n 출력하는 프로세스 개수 바꿈
u 사용자에 따라 정렬하여 출력 M 사용하는 메모리 크기에 따라 정렬
p CPU 사용량 따라 정렬 q top 명령 종료

 

3. 프로세스 작업 제어

 (1) 포그라운드, 백그라운드 프로세스

  ⓐ 포그라운드

  - 어떤 명령을 실행하면 그 명령이 끝날때까지 기다려야 다시 터미널을 사용할 수 있음

  - 프롬프트가 다시 출력될 때까지 기다려야 함

  - 작업 제거 도구 : 한 터미널에서 동시에 여러 프로세스를 실행하고 관리하기 위해 개발

  ⓑ 백그라운드

   - 명령의 처리가 끝나는 것과 관계없이 곧바로 프롬프트가 출력되어 다른 작업을 계속 할 수 있다

   - 백그라운드 작업은 명령의 실행 시간이 오래 걸릴 것으로 예상되나 명령 실행 후 다른 작업을 할 필요가 없을 때 사용

   - 명령을 백그라운드로 실행하려면 마지막에 &(애퍼센트) 기호를 추가하면 됨

   - 예) sleep 100&

   - 백그라운드 작업의 실행이 끝나면 백그라운드 작업 결과가 터미널 화면으로 그냥 출력되어 현재 작업 화면과 섞일 수 있음

  > 백그라운드 처리 시에는 출력과 오류 방향을 전환하고, 실행 결과와 오류 메세지는 파일로 저장하는 방식 사용하여 문제 해결

  ⓒ job : 백그라운드 작업을 모두 보여줌, 특정 작업 번호를 지정하면 특정 작업만 보여줌

   - job [%작업 번호]

   * %번호 : 해당 번호의 작업 정보 출력

   * %+또는 %% : 작업 순서가 +인 작업 정보 출력  > + 가장 최근에 접근한 작업

   * %- : 작업 순서가 -인 작업 정보 출력  > + 작업 전에 실행한 작업

   - 작업 변환 : [Ctrl]+z(포그라운드 작업 중지), bg % 작업 번호(백그라운드로 전환), fg % 작업 번호(포그라운드로 전환)

   - 현재 포그라운드로 실행 중인 작업을 백그라운드로 전환하려면 CTRL+Z로 작업 중지 후 bg %작업번호 입력

   * CTRL+C는 포그라운드 작업이 대부분 종료됨 == 인터럽트 시그널을 포그라운드 프로세스에 전달하여 종료

   * 혹은 다른 터미널에서 해당 프로세스의 PID를 찾아 kill 혹은 작업 번호(%작업번호)

   - 로그아웃 후에도 백그라운드 작업을 계속 해야할 때 nohup 명령 사용

   > 반드시 백그라운드 실행 필요, 별도로 출력 방향을 전환하지 않으면 실행 결과 및 오류메세지가 nohub.out에 저장됨

   > 출력 방향 전환 시 nohub.out에 저장 안함