04/11 — 프로세스·서비스·로그·스케줄링
프로그램이 실행되면 프로세스가 된다. 이번에는 **“무엇이 실행 중이고, 누가 관리하며, 언제 실행되고, 무슨 기록을 남기는가?”**를 연결한다. 명령은 기능과 결과를 연결해 읽는 필기 학습용 예제다.
1. 프로세스의 신분과 생명주기
PID는 프로세스 번호, PPID는 부모 프로세스 번호다. 프로세스에는 실행 신분·메모리·열린 파일·현재 디렉터리·환경 등이 있다. 프로세스 안의 스레드는 실행 흐름이며 주소 공간 등을 공유한다. 프로세스 수는 실행 인스턴스의 수를, 스레드 수는 각 프로세스 내부 실행 흐름의 수를 나타낸다.
fork는 자식 프로세스 생성, exec는 현재 프로세스의 프로그램 이미지 교체로 이해한다. exec를 수행한 프로세스는 기존 PID를 유지한다. 부모는 wait 계열로 자식의 종료 상태를 회수한다.
| 상태 | 뜻 | 시스템에서의 모습 |
|---|---|---|
| R | 실행 중 또는 실행 가능 | CPU에서 실행하거나 실행 순서를 기다림 |
| S | 인터럽트 가능한 대기 | 이벤트를 기다리며 시그널에 반응 가능 |
| D | 인터럽트 불가능 대기 | 흔히 장치 I/O 등 커널 작업 완료를 기다림 |
| T | 정지 | 작업 제어·시그널 등에 의해 실행이 멈춤 |
| Z | 좀비 | 실행 종료 후 부모의 종료 상태 회수를 기다림 |
좀비는 실행을 마치고 종료 상태 정보가 남은 프로세스다. 부모의 wait 계열 호출이 그 정보를 회수한다. 고아 프로세스는 부모가 먼저 종료한 프로세스로, init 또는 subreaper가 새 부모 역할을 맡는다. 좀비는 종료 상태 회수와, 고아는 부모 관계의 변경과 연결해 기억한다.
2. 관찰 명령: 순간·지속·관계
ps -ef
ps aux
pstree -p
topps는 시점의 목록, top은 갱신되는 상태, pstree는 부모·자식 관계다. ps -ef는 UNIX 스타일 옵션, ps aux는 BSD 스타일 옵션이다. 각 형식을 ps -ef, ps aux로 묶어 기억한다.
| 항목 | 읽는 뜻 |
|---|---|
| PID / PPID | 본인 / 부모 번호 |
| UID 또는 USER | 실행 사용자 |
| %CPU / %MEM | CPU·메모리 사용 관련 비율 |
| VSZ | 가상 메모리 크기 |
| RSS | 상주 메모리 크기 |
| TTY | 연결 터미널. ?이면 제어 터미널이 없을 수 있음 |
| STAT | 상태와 부가 표시 |
| TIME | 누적 CPU 시간 |
| COMMAND | 실행 명령 |
VSZ는 프로세스의 가상 주소 공간 크기, RSS는 현재 RAM에 상주하는 부분의 크기다. ps의 CPU 비율은 해당 도구의 계산 구간과 함께 해석한다. PID 확인에는 pgrep, 열린 파일에는 lsof, 프로세스가 사용하는 경로에는 fuser를 연결한다. ps 매뉴얼
3. 시그널: 종료 요청·정지·재개를 전달한다
kill은 프로세스에 시그널을 보내는 명령이다. 기본은 SIGTERM이다.
| 시그널 | 흔한 Linux 번호 | 역할 |
|---|---|---|
| SIGHUP | 1 | 터미널 연결 종료 통지. 일부 데몬은 설정 재읽기로 사용 |
| SIGINT | 2 | 인터럽트. 보통 Ctrl+C |
| SIGKILL | 9 | 강제 종료. 잡거나 무시할 수 없음 |
| SIGTERM | 15 | 종료 요청. 정리 후 종료할 기회 |
| SIGCONT | 18 | 정지된 프로세스 재개 |
| SIGSTOP | 19 | 강제 정지. 잡거나 무시할 수 없음 |
| SIGTSTP | 20 | 터미널 정지 요청. 보통 Ctrl+Z |
번호 일부는 아키텍처별로 다르므로 이름이 더 이식성 있다. TERM은 프로그램의 종료 처리 절차를 거칠 기회를 주고, KILL은 커널이 강제 종료한다. SIGHUP의 기본 의미는 터미널 연결 종료 통지이며, 데몬의 설정 재읽기 같은 추가 반응은 프로그램 구현으로 정한다. signal 매뉴얼
4. 작업 제어·우선순위·자원 제한
포그라운드 작업은 터미널 입력을 받는 중심 작업, 백그라운드는 뒤에서 실행되는 작업이다. command &는 백그라운드 실행이다.
- Ctrl+Z: 보통 포그라운드 작업 정지.
- jobs: 현재 셸이 관리하는 작업 목록.
- bg %1: 작업 1을 백그라운드에서 재개.
- fg %1: 작업 1을 포그라운드로 가져옴.
- %1은 현재 셸의 작업 번호 1을 지정한다. PID는 운영체제가 프로세스에 부여한 번호다.
- nohup은 SIGHUP을 무시하도록 실행하는 데 사용한다. 백그라운드 실행을 함께 요청할 때는 nohup command & 형태로 쓴다.
nice 값은 일반적인 Linux 스케줄링에서 -20~19다. 숫자가 클수록 다른 작업에 양보하는 정도가 커져 CPU 우선도가 낮아진다. nice -n 10 command는 조정해서 시작, renice는 실행 중인 프로세스 조정이다. 일반 사용자는 보통 우선도를 높이는 음수 방향 변경에 제한이 있다. 실시간 스케줄링 우선순위는 nice와 별도다.
ulimit은 셸과 자식의 자원 한도를 다룬다. -n 열린 파일 수, -u 사용자 프로세스 수, -c 코어 덤프 크기를 연결한다. soft limit는 현재 적용값, hard limit는 올릴 수 있는 상한이다. /etc/security/limits.conf 등은 PAM 세션을 통한 한도와 관계되며 systemd 서비스에는 LimitNOFILE 등 별도 unit 설정도 있다.
5. 서비스와 systemd
데몬은 지속적으로 요청을 처리하는 프로세스이고, 서비스는 이를 시작·종료·감독하는 관리 단위로 다룬다. 서비스 하나에 프로세스가 여러 개 있을 수도 있고 oneshot 서비스처럼 작업 후 종료할 수도 있다.
| systemctl 동작 | 의미 |
|---|---|
| start / stop | 지금 시작 / 중지 |
| restart | 중지 후 시작 |
| reload | 프로그램이 지원하는 방식으로 설정 재읽기 |
| enable / disable | 부팅·target 연결 등 자동 시작 구성을 설정 / 해제 |
| is-active / is-enabled | 현재 실행 상태 / 활성화 구성 확인 |
| status | 상태·일부 최근 로그 |
| daemon-reload | systemd가 unit 정의를 다시 읽음 |
| mask | 일반적인 수동·의존성 시작까지 막도록 unit을 마스킹 |
start는 현재 실행을 시작하고, enable은 자동 시작 연결을 구성한다. enable —now는 자동 시작 구성과 현재 시작을 함께 요청한다. reload는 서비스가 자신의 설정을 재읽게 하고, daemon-reload는 systemd가 unit 정의를 재읽게 한다. reload는 해당 서비스가 지원할 때 사용한다. systemctl 매뉴얼
서비스 unit의 대표 구획은 [Unit] 설명·의존성, [Service] 실행 방식·사용자·명령, [Install] enable 시 연결이다.
[Unit]
Description=Example application
After=network.target
[Service]
Type=simple
User=app
ExecStart=/usr/local/bin/example-app
[Install]
WantedBy=multi-user.target위 예제는 unit 구획의 역할을 보여준다. After는 함께 시작되는 unit 사이의 순서를 정한다. Requires·Wants는 의존 unit을 시작하도록 연결하며 실패 전파 정도에 차이가 있다. network.target은 네트워크 관리 계층의 시작·종료 순서를 연결하는 동기화 지점이다. 외부 통신 상태는 주소·경로·대상 서비스에 대한 진단으로 확인한다.
RHEL 계열의 공급자 unit은 /usr/lib/systemd/system, 관리자 재정의는 /etc/systemd/system이 대표적이다. Debian 계열의 /lib 경로는 usr-merge 여부에 따라 연결될 수 있다. 공급자 파일을 직접 고치기보다 drop-in을 쓰는 구분을 알아두자.
6. 전통적 init·xinetd와의 연결
SysV init에서는 /etc/inittab, /etc/init.d/ 스크립트, rc?.d/의 S·K 연결과 순서 번호를 본다. chkconfig는 런레벨별 자동 실행 설정, service 명령은 스크립트 시작·중지와 연결한다. 현대 배포판에서는 호환 래퍼일 수 있다.
전통적 RHEL 런레벨은 0 종료, 1 단일 사용자, 3 텍스트 다중 사용자, 5 그래픽 다중 사용자, 6 재부팅으로 연결한다. 2의 역할은 배포판별 차이가 있다. systemd에서는 단일 사용자 복구를 rescue.target, 텍스트 다중 사용자를 multi-user.target, 그래픽 다중 사용자를 graphical.target의 역할로 연결한다. 구체적인 구성과 동작은 각 init 체계의 설정을 따른다.
inetd/xinetd는 요청이 오면 서비스를 띄우는 슈퍼서버다. xinetd.conf와 xinetd.d/의 service 설정에서 socket_type, protocol, wait, user, server, disable, only_from 등을 본다. standalone 데몬은 자체적으로 대기하고, 슈퍼서버 방식은 요청을 받아 개별 서비스를 실행한다. systemd의 socket activation은 소켓이 요청을 받아 서비스를 깨우는 방식이다.
7. 주기 작업과 일회 작업
사용자 crontab은 분 시 일 월 요일 명령이다. 시스템 /etc/crontab과 /etc/cron.d/ 형식은 명령 앞에 실행 사용자 필드가 더 들어간다.
30 2 * * 1 /usr/local/bin/report매주 월요일 02:30 실행이다. *는 전체, 1,3,5는 나열, 1-5는 범위, */10은 해당 필드에서 10칸 간격이다. 분 필드의 */10은 매시간 0·10·20·30·40·50분에 대응한다.
일(day of month)과 요일을 둘 다 제한하면 일반적인 Cronie/Vixie cron에서는 둘 중 하나가 맞는 OR로 작동한다. 분·시·월 조건도 함께 맞아야 한다. 시간대·일광절약시간과 구현 차이에 주의한다.
crontab -e 편집, -l 조회, -r 삭제다. 마지막 것은 전체 사용자 crontab을 지울 수 있어 주의한다. cron은 대화형 셸과 환경이 달라 절대경로·PATH·출력 위치를 명확히 한다. %는 명령 부분에서 특별 취급될 수 있으므로 날짜 포맷 등에 들어가면 이스케이프를 확인한다. crontab 매뉴얼
at는 일회 실행 예약, atq는 목록, atrm은 제거다. anacron은 실행 기록과 일 단위 주기를 기준으로, 시스템 중단 등으로 기한이 지난 일·주·월 단위 작업을 나중에 수행한다. cron.allow/deny, at.allow/deny는 해당 도구 사용 허용과 관련되고 실제 세부 기본값은 구현을 확인한다.
8. 로그: 기록 위치와 조회 도구를 짝짓기
systemd-journald는 journal을 수집한다. journalctl -u sshd는 서비스별, -b는 현재 부팅, -b -1은 직전 부팅, -f는 이어 보기, -p err는 오류 우선순위 필터다. 저장 정책에 따라 재부팅 전 로그가 없을 수도 있다.
rsyslog는 facility·severity에 따라 파일·원격 목적지로 전달한다. /etc/rsyslog.conf와 rsyslog.d/를 본다. 심각도 숫자는 0 emerg부터 7 debug이며 숫자가 작을수록 긴급하다. 전통 selector에서 mail.info는 보통 info와 그보다 심각한 mail 로그를 포함한다. =info는 info 수준만 선택한다.
| 자료 | 용도 |
|---|---|
| /var/log/messages, /var/log/syslog | 일반 시스템 로그. 배포판 차이 |
| /var/log/secure, /var/log/auth.log | 인증 관련. 배포판 차이 |
| /var/log/maillog, /var/log/mail.log | 메일 관련. 설정에 따라 다름 |
| wtmp / btmp | 로그인 이력 / 실패 이력. last / lastb |
| utmp | 현재 로그인 정보. who·w와 연결 |
| dmesg | 커널 링 버퍼 확인 |
로그를 해석할 때는 수집 대상·조회 권한·보존 기간을 함께 확인한다. rsyslog는 수집한 로그를 목적지로 전달하고, logrotate는 저장된 로그 파일의 순환·압축·보존 개수를 관리한다.
시스템 분석에는 uptime의 load average, free의 메모리, vmstat의 CPU·메모리·I/O 대기, iostat의 장치 I/O, sar의 시계열을 연결한다. Linux load average는 실행 가능 작업과 인터럽트 불가능 대기의 평균 수를 나타내고, CPU 사용률은 CPU 시간의 사용 비율을 나타낸다. 파일 캐시는 메모리를 활용해 I/O를 줄이며, 커널은 필요할 때 회수 가능한 캐시를 다른 용도로 전환한다.
필기용 압축
- fork는 자식을 생성하고 exec는 현재 프로그램 이미지를 교체하며 wait는 자식 종료 상태를 회수한다. 좀비는 종료 상태 회수 대기, 고아는 부모 종료 후 새 부모에 인계된 프로세스다.
- ps는 한 시점의 목록, top은 갱신 상태, pstree는 부모·자식 관계를 보여준다. VSZ는 가상 메모리, RSS는 상주 메모리 크기다.
- TERM은 정리 가능한 종료 요청, KILL은 강제 종료, STOP은 정지, CONT는 재개다. Ctrl+C는 보통 INT, Ctrl+Z는 TSTP를 보낸다.
- nice 값이 클수록 CPU를 더 양보한다. %번호는 셸 작업을, PID는 운영체제의 프로세스를 식별한다.
- start는 지금 시작, enable은 자동 시작 연결이다. reload는 서비스 설정, daemon-reload는 systemd unit 정의를 재읽는다.
- 사용자 cron 형식은 분·시·일·월·요일·명령이다. 시스템 crontab은 명령 앞에 실행 사용자를 둔다. cron은 반복, at는 일회, anacron은 기한이 지난 일 단위 작업을 예약한다.
- journalctl은 journal 조회, rsyslog는 로그 전달, logrotate는 파일 순환을 담당한다. wtmp는 로그인 이력, btmp는 실패 이력을 저장한다.
회상점검 — 단원 끝 한 번
- fork·exec·wait는 각각 무엇을 하며, 부모는 좀비의 종료 상태를 어떤 동작으로 회수하나?
- ps·top·pstree가 보여주는 관점은 무엇인가?
- TERM·KILL·STOP·CONT를 설명하고 Ctrl+C와 Ctrl+Z를 구별해봐.
- nice 15와 nice 0 중 어느 쪽이 더 양보하나? %1과 PID 1은 각각 어떤 번호인가?
- start·enable, reload·daemon-reload는 어떻게 다른가?
- 사용자 crontab과 /etc/crontab 형식 차이, 30 2 * * 1의 뜻은?
- at·cron·anacron의 용도 차이는?
- journalctl·rsyslog·logrotate, wtmp·btmp를 각각 연결해봐.
출처·검증 범위
2026-09-09 작성. ps·signal·systemctl·crontab 매뉴얼을 참조했다. 최신 매뉴얼의 새 옵션을 RHEL 8에 자동 적용하지 않고 공통 기능 중심으로 구성했다. 모든 로그 기본 경로·PAM 한도·레거시 init 옵션 전수 대조와 실제 명령 실행은 미실행이다. 자체 예제이며 기출 미사용. 사전 작성은 실제 학습 전달·회상·숙달과 별개다.