0x0102

KDT - Linux 프로세스 잡 관리 본문

Study/System Engineer

KDT - Linux 프로세스 잡 관리

jxx_yxjx 2024. 1. 16. 13:04

1. 프로세스란?

기본적으로 프로그램 실행 순서는 [디스크에 저장된 프로그램을 커널이 메모리에 올린다] -> [메모리에 올라간 프로그램을 cpu가 실행한다] 와 같다.

이 때 메모리에 위에 올라가서 실행 중인 프로그램을 프로세스라고 한다.

프로세스는 각 pid라는 고유 번호를 할당받아 관리된다.

 

2. 프로세스를 조회할 수 있는 ps 명령어

$ ps : 현재 실행 중인 프로세스 목록

bash는 실행하자마자 열렸고, ps는 ps를 입력하여 추가된 것이다.

다시 입력하면 pid가 바뀌는 것을 확인할 수 있는데, 이렇게 특정 명령이 프로세스로 전환되고 실행이 끝나면 프로세스 목록에서 사라진다.

pid는 랜덤하게 배정되기 때문에 매번 바뀔 확률이 높다.

 

3. 백그라운드에서 돌아가는 프로세스들 (데몬 프로세스) 조회

터미널과 무관하게 항상 돌아가는 프로세스(항상 켜져있어야 하는 프로세스)를 데몬 프로세스라고 칭하며 이런 종류의 프로세스를 조회할 때는 $ ps x 와 같이 x 옵션을 사용해야 한다.

 

4. 시스템의 모든 프로세스들 조회

$ ps a 로 시스템 내부의 동작 중인 모든 프로세스를 조회할 수 있다.

 

5. 자주 사용하는 ps 옵션

ps 옵션은 -를 사용하지 않는 것이 특징이다.

x → ps 명령어를 실행한 사용자의 프로세스 전체 출력

ux → ps 명령어를 실행한 사용자의 프로세스를 상세히 출력

ax → 모든 사용자의 프로세스를 출력

aux →모든 사용자의 프로세스를 상세하게 출력

auxww → aux 옵션의 출력 결과가 화면에 잘리지 않도록 출력

 

6. 페이지 별 출력

$ ps ux | less 로 리눅스 시스템에서 실행되는 모든 프로세스를 페이지 별로 출력할 수 있다.

 

7. 메모리 구조

$ top으로 메모리 사용량 등을 실시간으로 알 수 있다.

 

8. 잡

커널 입장에서 실행되는 것들을 프로세스라고 한다면 셸에서 실행하고 있는 단위는 잡이라고 한다.

예를 들어, $ echo hello world | date > date.txt 의 경우 2개의 프로세스를 실행하지만 명령어에 따른 잡은 하나만 생성되는 식이다.

몇 개의 프로세스를 ctrl + z로 강제 중지 시켜 정지상태로 쌓아두고

$ jobs 명령어로 조회하면 셸 별로 job이 따로 집계되는 것을 확인할 수 있다.

$ jobs - l 로 잡 목록에 프로세스 id까지 조회할 수 있다.

 

9. fg 명령어를 통한 잡의 포그라운드 전환

포그라운드는 사용자의 입력을 받을 수 있는 상태를 의미하며 정지상태에 있는 bash 메뉴얼을 다시 확인하려면 포그라운드로 되돌려야 한다.

전환을 위해서는 $ fg %번호 의 형식으로 입력하면 된다.

1번 잡인 man bash를 $ fg %1로 포그라운드로 돌리고 q로 종료하면 잡은 2번만 남게 된다.

이렇게 하나의 잡만 조회되는 경우, $fg 만 입력해도 해당 잡이 포그라운드 상태로 전환된다.

 

10. bg 명령어를 활용한 잡의 백그라운드 전환

ctrl + z로 잡을 중지시키면 해당 잡이 동작을 멈추기 때문에 아무리 기다려도 잡이 자동 종료되지 않는다.

이런 경우 잡을 셸로 돌리면 된다.

포그라운드가 나의 제어권에 잡을 두는 거라면 백그라운드는 내가 조작할 수 없으나 돌아가게 두는 것이다.

$bg %번호 를 이용하여 전환할 수 있다.

다음과 같은 명령을 포그라운드에 두면 sleep 40초가 끝날 때까지 아무것도 하지 못하다가 모든 작업이 끝나면 제어권이 돌아온다. 

반면 bg를 이용하여 백그라운드로 살려내는 경우 작업이 끝나지 않고도 제어권을 되찾아오고, 잡은 백그라운드에서 수행되는 병렬 작업이 가능하다.

 

11. 잡과 프로세스의 종료

윈도우나 맥에 프로세스 강제 종료가 있듯 리눅스에서도 잡과 프로세스를 강제 종료할 수 있는 명령어가 있다.

잡의 종료: $ kill %잡번호 로 백그라운드에서 실행 중인 잡을 종료할 수 있다.

프로세스의 종료: $ kill pid번호 로 ps 조회시 알 수 있는 pid 정보를 이용하여 프로세스를 종료할 수 있다.

프로세스는 로그인한 유저가 실행한 프로세스만 삭제 가능하지만, root의 경우 예외적으로 다른 유저의 프로세스를 강제 종료 시킬 수 있다.

+ $ killall -9 프로세스명 으로 특정 pid가 아닌 프로세스의 이름만으로(같은 이름을 가진 모든 프로세스) 종료를 시킬 수 있다.

 

12. 리눅스에서 사용가능한 신호들과 kill의 동작 원리

kill은 프로세스를 죽이는 명령어라기 보단 프로세스에 특정 신호를 보내는 명령어이다.

아래와 같이 신호에는 고유 이름과 번호가 있다.

SIGHUP, 1 → 터미널 제어시 또는 제어 프로세스의 종료시 감지되는 행업 신호

SIGUNT, 2 → 키보드에서 보내는 인터럽트 신호

SIGQUIT, 3 → 키보드에서 보낸 종료 신호

SIGABRT, 6 → abort(3)로 받은 신호 무시

SIGKILL, 9 → kill 신호

SIGTERM, 15 → 중단 신호

SIGCONT, 19, 18, 25 → 중지된 프로세스 재개

SIGSTOP, 17, 19, 23 → 프로세스 중지

ex) pid가 100인 프로세스를 중지시키는 경우 > $ kill 100, $ kill -15 100, $ kill -SIGKILL 100

88번 pid의 설정파일을 다시 읽게 하고 싶은 경우 > # kill -1 88, # systemctl reload httpd 와 같이 1번 신호를 준 다음 명령어 작성

'Study > System Engineer' 카테고리의 다른 글

KDT -Shell script 2  (0) 2024.01.19
KDT - Shell script  (0) 2024.01.18
KDT - Linux Text Editor  (1) 2024.01.15
KDT - Linux 권한  (0) 2024.01.12
KDT - Linux 파일시스템  (1) 2024.01.11