
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에 저장 안함
'컴퓨터공학부' 카테고리의 다른 글
| [데이터 구조와 활용] 트리 (0) | 2026.04.17 |
|---|---|
| [자료구조] 연결된 구조 (0) | 2026.04.16 |
| [시스템 프로그래밍 Linux] 셸 사용법 (0) | 2026.04.14 |
| [문제 해결 알고리즘] 그리디 알고리즘 ① (0) | 2026.04.13 |
| [데이터 구조와 활용] 덱 (0) | 2026.04.12 |