8 min to read
Linux #3 / TIL
리눅스 알아보기 3rd Chapter !!
1. 프로세스 관리
2. 서비스 관리
3. 자동화
프로세스 관리
- 프로그램 : 사용자가 원하는 일을 처리 할 수 있도록 프로그래밍 언어를 사용하여 수행 절차를 표현해놓은 명령어들의 집합, 코드 / 정적인 파일 상태
- 프로세스 : 실행되고 있는 프로그램, 프로그램은 운영체제로부터 실행에 필요한 메모리를 할당 받아 코드를 실행한다.
- 하나의 프로그램은 여러개의 프로세스를 만들 수 있다. (다중 프로세스)
- 스레드 : 프로세스 안에서 코드가 실행되는 흐름
- 멀티 스레드 : 애플리케이션 내부의 멀티 태스킹 (멀티 프로세스 : 애플리케이션 단위)
- 대용량 데이터의 처리시간을 줄이기 위해 데이터를 분할하여 병렬로 처리한다.
- UI를 가지고 있는 애플리케이션에서 네트워크 통신을 하기 위해 사용할 수 있다.
- 여러 클라이언트의 요청을 처리하는 서버를 개발할 때에도 사용한다.
리눅스의 프로세스의 동작 방식
- 포그라운드 (foreground)
- 사용자가 입력한 명령이 실행되어 결과가 출력될 때까지 기다려야 하는 방식 - 백그라운드 (background)
- 프로세스가 실행되는 동안 다른 프로세스가 뒤에서 실행될 수 있다. 백그라운드 작업은 명령의 실행 시간이 많이 걸릴 것으로 예상되거나, 명령을 실행한 후 다른 작업을 해야할 경우 사용한다.
- 명령어 뒤에 &를 붙여서 실행하고, 다른 명령어를 추가적으로 입력할 수 있다.
- 백그라운드 방식으로 실행해도 사용자의 터미널 세션이 종료되면 실행중인 프로세스도 종료된다.
- 작업시간이 오래 걸리는 작업인 경우 ‘nohup’ 명령어를 이용하여 백그라운드로 실행하면, 사용자 터미널 세션이 종료되어도 작업이 종료될 때까지 프로세스를 실행한다.
# 포그라운드 방식
$ command
$ ping google.com
# 백그라운드 방식 -- &추가
$ command &
$ ping google.com &
# nohup 커맨드(no hang up)
$ nohup command &
$ nohup ping google.com &
컴퓨터에서 실행되고 있는 프로세스의 목록을 확인하고 관리하기 위한 명령 사용법 / 기본 용어
- ps : 현재 실행중인 프로세스의 목록
- PID : 프로세스 번호
- TTY : 프로세스가 실행된 터미널의 종류와 번호
- TIME : 프로세스 실행 시간
- CMD : 실행되고 있는 프로세스의 이름 (명령)
ps 와 함께 사용할 수 있는 옵션
- UNIX 방식
ps -e : 시스템에서 실행중인 모든 프로세스의 정보 출력
ps - f : 프로세스의 자세한 정보 출력 / *출력 정보 : UID, PPID, C, STIME, TTY, STAT
ps -u uid : uid로 특정한 사용자에 대한 모든 프로세스의 정보 출력
ps -p pid : pid로 지정한 특정 프로세스의 정보 출력 - BSD 방식 / *출력 정보 : USER, %CPU, %MEM, PSS, VSZ, START**
ps a** : 터미널에서 실행한 프로세스의 정보 출력
ps u : 프로세스 소유자의 이름, CPU 사용량, 메모리 사용량 등 상세 정보 출력
ps x : 시스템에서 실행중인 모든 프로세스의 정보 출력
출력 정보 의미 ▼
- UID : 프로세스를 실행한 사용자 ID
- PPID : 부모 프로세스 번호
- C, %CPU : CPU 사용량 (%)
- STIME : 프로세스의 시작 날짜나 시간
- TTY : 프로세스가 실행된 터미널의 종류와 번호
- STAT : 프로세스 상태
- USER : 사용자 계정 이름
- %MEM : 물리적 메모리 사용량 (%)
- RSS : 사용하고 있는 물리적 메모리 크기(kb)
- VSZ : 사용하고 있는 가상 메모리의 크기(kb)
- START : 프로세스 시작 시간
- pstree : 컴퓨터 전체 프로세스를 트리 구조로 도식화하여 확인할 수 있는 명령어 / 부모 관계를 한 눈에 파악할 수 있다.
- man pstree 명령어를 사용하면 의미를 알 수 있다.
- kill : 특정 프로세스에 작업 중지, 실행 종료, 대기, 재시작, 강제 종료 등의 시그널을 전달하기 위해 사용
시그널 사용법 / 종류
kill -시그널번호(시그널명) %작업번호
kill -시그널번호(시그널명) PID
- HUP : 재시작
- INT : 실행 중지 / Ctrl + c
- KILL : 강제 종료
- TERM : 정상 종료 (기본 명령)
- CONT : 정지된 프로세스 실행
- STOP : 터미널에서 입력되는 정지 시그널
- TSTP : 실행 정지 후 재실행 대시 / Ctri + z
- jobs : 백그라운드에서 수행 중인 프로세스
- 다수의 프로세스가 백그라운드에서 작업하는 도중 필요하다면, fg %작업번호 명령으로 포그라운드로 전환할 수 있다.
- [1], [2] : 작업 번호
- ’ + ‘ : 현재 처리되고 있는 작업
- ’ - ‘ : 다음에 작업할 프로세스
프로세스의 상태
- Running : 실행중
- Suspended : 일시 중단 (Ctrl + z 입력)
- Terminated : 강제 종료 (kill 명령 종료)
- Done : 정상 종료
서비스 관리 (데몬)
-
데몬 : 백그라운드에서 작동하는 프로세스 / 상시 실행
- 리눅스 환경에서 시스템 초기화가 끝난 후, 특별한 프로그램(init)에 의해 자발적으로 백그라운드에서 실행하는 프로그램
- 프로그램 이름 끝에 ‘d’ 가 붙는다. [ex ≫ syslogd, httpd 등]
- 데몬이라는 용어는 운영체제 관점이고, 사용자의 관점에서는 ‘서비스’라고 불린다. - **데몬이 하는 일
**- 하드웨어 장치 관리
- 보조 기억장치와 디렉토리 연결 (마운트)
- 네트워크를 통한 프로세스간 통신 (소켓)
- 애플리케이션 수준의 서비스 제공 - 웹 서버 (httpd) : 웹 서버는 일반적으로 백그라운드에서 작동되므로, 이를 데몬이라고 부를 수 있다.
# index.html 이라는 HTML 파일 생성
$ echo "<html><body><h1>나의 첫 HTML 페이지</h1></body></html>" > index.html
# 웹 서버 실행, 8888 포트를 통해 접속이 가능
$ busybox httpd -h . -p 8888
# 웹 서버에 접속
$ curl http://localhost:8888
<html><body><h1>나의 첫 HTML 페이지</h1></body></html>
# 프로세스 확인 명령 / 데몬이 실행중인지 확인
$ ps aux | grep httpd
ubuntu 10847 0.0 0.0 2456 76 ? Ss 12:14 0:00 busybox httpd -h . -p 8888
ubuntu 10855 0.0 0.2 7004 2240 pts/1 R+ 12:15 0:00 grep httpd
# PID를 이용해 프로세스 강제 종료
$ kill -9 10847
# 웹 서버에 다시 접속 시, 접속 실패
$ curl http://localhost:8888
curl: (7) Failed to connect to localhost port 8888 after 0 ms: Connection refused
- cron 데몬 : 백그라운드에서 실행하는 스케쥴에 따라 명령을 실행하는 도구, 사람의 개입없이 자동적으로 주기에 따라 명령 실행
$ crontab -e
no crontab for ubuntu - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]: 1
≫ 다음과 같은 명령을 실행하면 nano 에디터가 열린다.
# data 명령의 출력과 uptime 명령의 출력을 합쳐서
# 홈 디렉토리의 uptime.log에기록하는 명령을 매 분마다 실행한다.
# '* * * * *' 는 매 분을 뜻한다.
* * * * * echo $(/bin/date) - $(/usr/bin/uptime) >> ~/uptime.log
≫ 파일을 저장하고 닫으면, 성공적으로 스케줄에 의한 명령(job)이 등록되었음을 확인할 수 있다.
crontab: installing new crontab
시간이 지난 후 uptime.log 파일을 살펴보면 다음과 같이 백그라운드에서 주기적으로 명령을 실행하는 것을 볼 수 있다.
이 실행이 끝나면, 매 분마다 한 줄씩 늘어나는 uptime.log 파일이 한없이 커지지 않도록, 방금 만든 crontab을 삭제해야 한다.
$ crontab -r
$ crontab -l
no crontab for ubuntu
- systemctl : 모든 데몬의 목록과, 상태를 확인하고 관리할 수 있다.
# 서비스 목록만 확인
$ systemctl --type=service
* cron.service : 시스템 초기화가 끝나고 init에 의해 자동으로 실행되며, 별 다른 데몬 실행 과정 없이 cron 데몬을 발견할 수 있다.
systemctl의 하위 명령
명령 | 기능 |
systemctl list-unit-files | 설치된 유닛(데몬)을 보여준다. |
systemctl enable <unit> | 부팅 시 유닛을 활성화한다. |
systemctl disable <unit> | 유닛이 부팅 시 비활성화된다. |
systemctl start <unit> | 유닛을 즉시 활성화시킨다. |
systemctl stop <unit> | 유닛을 즉시 비활성화한다. |
systemctl restart <unit>/td> | 유닛을 즉시 재시작한다. | </tr>
systemctl status <unit> | 유닛의 상태와 최근 로그들을 조회한다. |