728x90
반응형
1. 프로세스 개념
1) 개요
- 리눅스는 다중 프로세스 시스템으로, 실행 중인 프로그램은 프로세스 형태로 관리된다.
- 프로세스는 부모-자식 관계를 가지고 생성되며, 시스템 프로세스(운영체제가 생성)와 사용자 프로세스(사용자가 생성)로 나눌 수 있다.
- 리눅스 부팅 시
systemd
와kthreadd
프로세스가 생성되며, 이 두 프로세스를 제외한 모든 프로세스는 부모 프로세스가 존재한다. - 자식 프로세스는 부모 프로세스에 의해 생성되며, 자신의 작업이 종료되면 부모에게 결과를 전달하고 종료된다. 결과는 정상 수행이나 에러로 인한 종료를 구분하기 위한 값이다.
- 예를 들어, 사용자가 로그인하여 bash shell을 실행하고 vi 편집기를 실행하면 vi 프로세스는 자식 프로세스가 되고, bash shell은 부모 프로세스가 된다. vi 편집기를 종료하면 결과를 bash shell에게 전달하고 종료된다.
2) 프로세스 번호
- 프로세스는 관리의 편리성을 위해 고유한 번호, 즉 PID(Process Identification Number)를 부여받는다.
- 이름 대신 번호를 사용하는 이유는 하나의 프로그램을 동시에 여러 번 실행할 수 있기 때문이다.
- PID는 1번부터 일련번호 형태로 부여되며,
systemd
가 1번,kthreadd
가 2번으로 생성된다. - 유닉스에서는
init
프로세스가 1번이었으나, 우분투에서는init
의 이름을systemd
로 변경하였다.
2. 프로세스 종류
리눅스의 프로세스 중 사용자가 실행한 경우, 잠깐 실행되었다가 종료될 수 있다. 다음은 주요 프로세스 종류이다.
1) Daemon Process
- 특정 서비스를 지속적으로 제공하기 위해 존재한다.
- 커널에 의해 실행되며 평소에는 대기 상태에 있다가 요청이 오면 서비스를 제공한다.
- 서버에서 구동되는 프로세스들이 여기에 해당하며, 일반적으로 ‘부탁을 하면 그때 와서 일을 해’라는 비유로 설명할 수 있다.
- 지속적으로 실행되거나 작업 시간이 오래 걸리는 경우 주로 데몬으로 실행된다.
2) Orphan Process
- 부모 프로세스가 종료되었음에도 종료되지 않고 남아있는 자식 프로세스이다.
- 이 경우, 1번 프로세스가 새로운 부모 프로세스가 된다.
3) Zombie Process
- 자식 프로세스가 종료될 때 부모 프로세스에게 종료 사실을 알리고 종료되지만, 부모 프로세스의 자식 프로세스 테이블에는 여전히 남아있는 형태이다.
- 부모 프로세스가 자식 프로세스의 종료를 제대로 처리하지 못해 발생하며, 프로세스 목록에서는
defunct
로 표시된다. - 부모 프로세스는 자식 프로세스를 테이블 형태로 관리하는데, 테이블의 용량이 유한하다. 용량이 다 차면 더 이상 프로세스를 생성할 수 없다.
- 좀비 프로세스는 kill 명령으로 종료할 수 없으므로, 부모 프로세스를 종료하거나
SIGCHILD
시그널을 보내서 정리하도록 해야 한다. SIGCHILD
시그널을 보내면 이 프로세스는 고아 프로세스로 전환되고, 1번 프로세스가 부모 프로세스가 되어 일정 시간 단위로 조회를 통해 제거된다.
3. 프로세스 목록 확인
리눅스에서 실행 중인 프로세스 목록은 ps
명령어로 확인할 수 있다.
ps [옵션]
1) 유닉스 옵션
-e
: 모든 프로세스 정보를 출력한다.-f
: 프로세스에 대한 자세한 정보를 출력한다.-u uid
: 특정 유저가 실행한 프로세스를 출력한다.-p pid
: 특정 프로세스 ID에 해당하는 프로세스 정보를 출력한다.
2) BSD 옵션
a
: 터미널에서 실행한 모든 프로세스 정보를 출력한다.u
: 프로세스를 자세히 출력한다.x
: 시스템에서 실행한 모든 프로세스를 출력한다.
PPID는 Parents Process ID를 의미하며, ps -f
명령어를 bash 쉘에서 입력했을 때 PPID가 13169로 표시된다.
- S는 대기 중
- R은 실행 중
- Z는 좀비
3) 특정 프로세스 검색
특정 프로세스를 검색하고자 할 때는 다음과 같은 방법을 사용할 수 있다.
ps -ef | grep 프로세스이름
상황에 따라 -e
나 -u
옵션을 적절히 사용해야 하며, 내용이 많을 때는 파이프(|
)와 grep
검색을 활용하면 유용하다.
4. 프로세스 관리
1) 특정 프로세스 검색
- 기본 형식:
pgrep [옵션] [패턴]
- 옵션
x
: 패턴과 일치하는 프로세스의 정보를 출력n
: 패턴을 포함하고 있는 가장 최근 프로세스의 정보를 출력u 사용자 이름
: 특정 사용자가 수행 중인 모든 프로세스를 출력l
: PID와 프로세스 이름 출력t 터미널
: 특정 단말기와 연결된 프로세스를 검색
- 설명: 특정 프로세스를 조회할 때
ps
와grep
을 조합해 사용했지만,pgrep
은 이 두 개를 합쳐놓은 명령어이다.
2) 프로세스 종료
- 시그널
- 프로세스에 무언가 발생했음을 알려주는 간단한 메시지
- 현재 버전의 리눅스에서 사용 가능한 시그널은
kill -l
로 확인 가능 - 주요 시그널:
- SIGHUP (1): 터미널과 연결이 끊겼을 때 발생, 프로세스 종료
- SIGINT (2): 인터럽트(CTRL+C) 발생
- 현재 수행 중인 작업보다 우선순위가 높은 경우에만 중지
- SIGQUIT (3): 종료 신호, 사용자가 CTRL+\를 입력하면 발생
- SIGKILL (9): 프로세스를 강제로 종료시키는 시그널, 이 시그널을 받은 프로세스는 무시할 수 없다.
- SIGALRM (14): 알람에 의해서 발생
- SIGTERM (15):
kill
명령이 보내는 기본 시그널
- kill
- 프로세스 종료 명령
- 형식:
kill [-시그널] PID
- pkill
- 프로세스 이름으로 종료
- killall
- 프로세스 이름으로 종료
3.)top
- 프로세스 정보를 주기적으로 출력하여 현재 실행 중인 프로세스의 상태를 모니터링할 수 있다.
4) 작업 제어
- 포그라운드 작업
- 사용자가 명령을 입력하면 쉘이 그 명령을 해석해 커널에 전달하여 실행.
- 특징: 명령이 수행되는 동안 프롬프트가 나타나지 않기 때문에 다른 명령을 입력할 수 없다.
- 예시:
sleep 100
명령을 실행하면 100초 후에 프롬프트가 돌아온다.
- 백그라운드 작업
- 다른 프로세스를 실행하는 동안 뒤에서 실행되는 작업.
- 실행 방법: 작업 뒤에
&
를 추가하여 실행. - 예시:
sleep 100 &
를 실행하면 프롬프트가 즉시 돌아온다.pgrep
명령어로 실행 중인 프로세스를 확인 가능
- jobs
- 모든 백그라운드 작업을 조회하는 명령.
- 형식:
jobs [%작업번호]
- 출력 예시:
[1]+ 실행 중 sleep 100 &
- 작업 전환
Ctrl + z
: 포그라운드 작업 중지bg %작업번호
: 작업 번호가 지시하는 작업을 백그라운드로 전환fg %작업번호
: 백그라운드 작업을 포그라운드로 전환
- 계속 실행
- 일반적인 작업은 로그아웃 시 종료.
- 로그아웃 후에도 계속 작업을 수행하려면
nohup 명령 &
로 실행하면 된다.
5) cronjob (작업 예약)
- 작업 예약 방법
- 운영체제에서 제공하는 기능 사용
- 프로그래밍 언어로 프로그램 작성
- 응용 프로그램의 기능 이용
- 쿠버네티스의 크론잡 기능 활용
- 정해진 시간에 한번만 실행
at
명령으로 설정.- 형식:
at [옵션] [시각] 작업 내용
- 옵션
l
: 현재 실행 대기 중인 명령 목록 출력r 작업번호
: 작업번호에 해당하는 작업 삭제m
: 작업 완료 시 사용자에게 메일로 알림f 파일경로
: 작업 내용을 파일에서 수행
- 시간 설정 방법
at 시간
: 지정한 시간에 동작- 예시:
at 16:00 pm
,at 1 am tomorrow
,at 1 am jul 31
,at 4 pm + 3days
- 예시:
- 작업 확인 명령
-
ls -l /var/spool/cron/atjobs
-
- 실습 예시
at
명령으로 설치 확인 및 작업 예약:at 10:50 am at> ls -l > a.out # ctrl+D로 예약 완료
- 11시 이후에 작업이 정상적으로 실행되었는지 확인
6) crontab: 주기를 가지고 작업을 계속 수행
형식: crontab [-u 사용자계정] [옵션] [파일 경로]
옵션:
-e
: 사용자의 crontab 파일을 편집-l
: crontab 파일의 목록을 출력-r
: crontab 파일을 삭제
crontab
명령으로 관리하는 파일은 사용자별로 생성되며, 이 파일에 반복 실행할 작업을 저장한다. 여러 개의 명령을 하나의 파일에 기록할 수 있는데, 이 경우 각 명령은 별도의 행에 작성해야 한다.
작성 방법
- 분 (00:59) 시간 (00-23) 일 (1-31) 월 (1-12) 요일 (0-6) 작업내용
- 요일은 0이 일요일, 6은 토요일을 의미한다.
- 앞의 5개 항목에서
*
가 있으면 해당 항목의 모든 값을 의미한다.30 23 1 * * 작업
: 매월 1일 23시 30분에 작업을 수행10 * 1 * * 작업
: 매월 1일 매시간 30분에 작업을 수행
- 하이픈 연산자를 사용하면 범위를 설정할 수 있다.
- 요일을 설정할 때
1-5
로 설정하면 월요일부터 금요일까지 포함된다.
- 요일을 설정할 때
,
를 이용해서 여러 개의 값을 지정하는 것이 가능하다.- 예:
1,3,5
- 예:
/
를 이용해서 단계 값을 설정하는 것도 가능하다.- 예:
1-10/2
: 1, 3, 5, 7, 9 - 예:
*/20
: 매 20분마다
- 예:
crontab -e
30 * * * * /usr/bin/ls -F > secondcron.out # ctrl+z, y, enter
crontab -l
# 예약된 작업이 수행되기 전까지는 secondcron.out 파일이 보이지 않음.
7) systemd service
- 개요
- systemd는 리눅스의 시스템과 서비스 관리를 위한 도구로, 유닉스의 init을 대체.
- 서비스 데몬 시작, 프로세스 상태 유지 및 시스템 상태 관리 기능 제공.
- unit
- 서비스 종류를 구분하기 위한 개념.
- 관리 대상의 이름을
서비스명.유닛종류
형태로 관리. - 주요 종류:
service
: 시스템 서비스 유닛target
: 유닛 그룹화socket
: 소켓 관리
- systemctl
- 형식:
systemctl [옵션] [명령] [유닛명]
- 유닛 이름은
이름.service
이나.service
생략 가능.
- 유닛 이름은
- 명령 예시:
systemctl start cron systemctl status ssh
- 형식:
# 서비스가 있는지 확인해보고 싶을 때
systemctl status ssh
systemctl -t service | grep ssh
systemctl start cron
# 서비스가 실행 중인지 확인
systemctl is-active cron
8) cgroup
- 자원 사용을 프로세스 그룹 단위로 제어할 수 있는 리눅스 커널 기능.
- CPU, Memory, Network, I/O 등을 포함하며, 컨테이너의 핵심 기술로 사용됨.
- 사용 방법: cgroup 가상 파일 시스템을 수동으로 마운트하거나,
libcgroup
과 같은 도구를 사용하여 생성 및 관리 가능.
728x90
반응형