[Linux] 프로세스 관리

JIWON·2025년 5월 20일

Linux

목록 보기
8/20
post-thumbnail

🔄 프로세스 관리

1️⃣ 프로세스

  • 실행중인 프로그램

  • 리눅스는 기본적으로 다중 프로세스 시스템이기 때문에 동시에 여러 개의 프로세스를 실행할 수 있다

🔸 프로세스는 부모 - 자식 관계

  • 모든 프로세스는 부모 - 자식 관계를 가진다

  • 리눅스에서 부팅할 때 스케줄러가 실행한 프로세스인 systemd 와 kthreadd 프로세스를 제외하면 모든 프로세스는 부모 프로세스를 가지고 있다

  • 자식 프로세스는 자신의 작업이 종료되면 결과를 부모 프로세스에게 반환하고 소멸됨

🔸 PID

  • 각 프로세스는 고유한 번호를 가지게 되는데 이를 PID 라고 한다

  • 1번 부터 시작하고 프로세스가 실행되면서 하나씩 증가하여 부여된다

  • systemd 프로세스 : 모든 시스템 프로세스의 부모 프로세스

  • kthreadd 프로세스: 모든 스레드의 부모 프로세스

  • 유닉스에서는 1번 프로세스의 이름이 init 이었는데 리눅스에서는 systemd로 변경되었고, 호환성 문제 때문에 init을 systemd의 심볼릭 링크로 만들었다
    ls -l /sbin/init

bin 디렉토리 - 명령어가 있는 디렉토리,
sbin 디렉토리 - 심볼릭링크 있는 디렉토리 - 호환하기 위해

2️⃣ 프로세스 종류

💠 daemon process

  • 특정 서비스를 제공하기 위해 존재하는 프로세스로 리눅스 커널에서 실행

  • 평소에는 대기 상태로 있다가 서비스 요청이 오면 서비스를 제공

💠 고아 프로세스

  • 자식 프로세스가 아직 실행 중인데 부모 프로세스가 종료된 경우

  • 고아 프로세스는 1번 프로세스가 부모 프로세스가 되도록해서 종료 할 수 있게 해야 한다

💠 좀비 프로세스

  • 자식 프로세스는 자신의 작업이 종료되면 종료 정보를 부모 프로세스에게 보내고 부모 프로세스는 프로세스 테이블 목록에서 자식 프로세스를 제거해야 하는데 프로세스 테이블 목록에 남아있는 경우

  • 이 경우 테이블 목록에 defunct 프로세스라고 나오기도 한다

  • kill 명령으로 삭제할 수 없으므로 SIGCHLD 시그널을 부모 프로세스에게 보내서 정리하도록 해야 한다


3️⃣ 프로세스 관리 명령

💠 프로세스 목록 확인

  • 기본 형식 : ps [옵션]

  • 옵션

    • -e : 시스템에서 실행 중인 모든 프로세스 확인

    • -f : 자세한 정보 출력

    • -u uid : 특정 사용자에 대한 프로세스 정보

    • -p pid : 특정 프로세스에 대한 정보

  • BSD 옵션으로 -를 붙이지 않음

    • a : 터미널에서 실행시킨 프로세스 정보

    • u : 상세 정보 출력

    • x : 실행중인 모든 프로세스

  • GNU 옵션으로 --로 시작

    • --pid PID목록 : 목록으로 지정한 프로세스 정보 확인

🔸 STAT의 의미

  • ps a 명령

  • R : 실행중

  • S : 인터럽트가 가능한 대기 상태

  • T : 작업 제어에 의한 정지된 상태

  • Z : 좀비 프로세스

  • s : 세션 리더 프로세스

  • + : 포그라운드 프로세스 그룹

  • l : 멀티스레드

🔸프로세스 정보 확인

  • ps au 명령

  • USER : 유저

  • %CPU : CPU 사용량

  • %MEM : 메모리 사용량

  • VSZ : 가상 메모리

  • RSS : 물리적 메모리

🔸 프로세스 전체 목록 확인

  • ps -ef 명령
  • [ ] 가 있는 것은 스레드이다

🔸 실행중인 모든 프로세스 확인

  • ps axps aux
  • ps ax | more : 페이지 단위 출력

🔸 특정사용자가 실행한 프로세스

ps -u 아이디

리눅스 명령 -> 웹사이트 처럼 gui 로 바꿔주는것 전부 리눅스 명령어로 하는 것임

ps -fu 아이디ps -f -u 아이디 : 더 자세히 확인

  • u UID 이런식으로 인자를 받는 옵션인 경우는 옵션의 순서가 상관이 있다

bash의 PID 확인


💠 특정 프로세스 정보 검색

  • ps 명령과 grep 명령을 이용하면 필요한 정보를 빠르게 검색 가능

🔸 bash프로세스에 대한 정보 탐색

ps -ef|grep bash

pgrep [옵션] [패턴]

  • 옵션
    • x : 패턴과 정확하게 일치하는 프로세스 정보 출력
    • n : 패턴을 포함하고 있는 가장 최근 프로세스 정보 출력
    • u 사용자이름 : 특정 사용자에 대한 모든 프로세스 정보
    • l : PID와 프로세스 이름을 출력
    • t term : 특정 단말기와 관련된 프로세스의 정보를 출력

🔸 bash 프로세스에 대한 정보 탐색

pgrep -x bash

🔸 pgrep의 결과를 ps 명령의 인자로 설정

PID가 1279인 프로세스 정보 출력

ps -fp $(pgrep -x bash)

🔸 특정 유저가 실행한 bash만 조회하기

ps -fp $(pgrep -u jiwoni bash)


💠 프로세스 종료

kill 이나 pkill

  • 프로세스에 시그널을 보내 프로세스를 종료
  • 프로세스를 종료하고자 할 때는 PID를 알아야 한다
  • 시그널 확인 방법 : kill -l
시그널번호기본 처리의미
SIGHUP1종료터미널과 연결이 끊겼을 때 발생
SIGINT2종료인터럽트로 사용자가 ctrl + c 입력 시 발생
SIGQUIT3종료, 코어덤프종료 신호로 사용자가 ctrl + \ 입력 시 발생
SIGKILL9종료이 시그널을 받은 프로세스는 무시할 수 없으며 강제 종료
SIGALRM14종료알람에 의해 발생
SIGTERM15종료kill 명령이 보내는 기본 시그널

kill 명령

  • kill 명령은 인자로 지정한 프로세스에 시그널을 전달
  • 각 프로세스는 각 시그널을 받았을 때 어떻게 처리할 것인지 동작이 지정됨
  • 형식 : kill [-시그널] PID
  • 시그널
    • 2: 인터럽트 시그널을 전송
    • 9 : 프로세스를 강제로 종료
    • 15 : 프로세스와 관련된 파일들을 정리하고 종료하는데, 종료되지 않은 프로세스가 있을 수 있음

🔍 kill 명령 실습

  1. 터미널에서 man ps 명령 수행
    -> 수행되는 중

  2. 다른 터미널에서 ps -fp $(pgrep -x man) 으로 PID 확인

  3. 다른 터미널에서 kill PID
    -> man ps 프로세스가 종료됨

pkill 명령

  • pkill 명령도 kill 명령과 마찬가지로 시그널을 보내지만 PID가 아니라 프로세스의 명령 이름(CMD) 으로 프로세스를 찾아 종료
  • kill 명령과의 차이점은 명령 이름으로 찾아 종료하므로 같은 명령이 여러 개 검색될 경우 한 번에 모두 종료한다는 것

🔍 pkill 명령 실습

  1. 여러 터미널에서 man ps 명령 수행

  2. 다른 터미널에서 ps -fp $(pgrep -x man) 수행

  3. pkill man 으로 프로세스 종료

  4. pgrep -x man 확인
    -> 프로세스 종료된거 확인 - 아무것도 뜨지 않음


4️⃣ 프로세스 관리 명령

💠 top

  • 현재 실행 중인 프로세스의 정보를 주기적으로 출력하는데 프로세스의 자세한 요약 정보를 상단에 출력

🔸 출력하는 정보

항목의미항목의미
PID프로세스 IDSHR프로세스가 사용하는 공유 메모리의 크기
USER사용자 계정%CPU퍼센트로 표시한 CPU 사용량
PR우선순위%MEM퍼센트로 표시한 메모리 사용량
NINice 값TIME+CPU 누적 이용 시간
VIRT프로세스가 사용하는 가상 메모리의 크기COMMAND명령 이름
RES프로세스가 사용하는 메모리의 크기

🔸 내부명령

내부명령기능
Enter, Space Bar화면을 즉시 다시 출력한다
h, ?도움말 화면을 출력
k프로세스를 종료, 종료할 프로세스의 PID를 물어본다
n출력하는 프로세스의 개수를 바꿈
u사용자에 따라 정렬하여 출력
M사용하는 메모리의 크기에 따라 정렬하여 출력
pcpu 사용량에 따라 정렬하여 출력
qtop 명령 종료

5️⃣ 포그라운드 및 백그라운드 프로세스

💠 포그라운드와 백그라운드

  • 사용자가 터미널에서 작업할 때 보통의 경우 한 번에 하나의 프로세스만 실행 가능

  • 어떤 명령을 실행하면 명령이 끝날 때까지 기다려야 다시 터미널을 사용할 수 있음

  • 어떤 프로세스를 실행하는 도중에 다른 프로세스를 실행해야 하는 경우가 발생할 수 있는데 작업 제어 도구는 이렇게 하나의 터미널에서 여러 프로세스를 실행하고 관리하기 위해 개발


💠 포그라운드 작업

  • 사용자가 입력한 명령이 실행되어 결과가 출력될 때까지 기다리는 방식으로 동작하는 프로세스

  • 명령이 실행중에는 프롬프트가 보이지 않기 때문에 다른 명령을 수행시킬 수 없음

  • 예: sleep 100 100초 동안 대기


💠 백그라운드 작업

  • 백그라운드 방식으로 작업을 수행하면 명령의 처리가 끝나는 것과 상관없이 곧바로 프롬프트가 출력되어 사용자가 다른작업을 계속할 수 있음

  • 수행시간이 오래걸리거나 다른 작업을 빠르게 출력하기 위해서 사용

  • 명령을 백그라운드로 실행하려면 명령의 마지막에 & 기호를 추가

  • 백그라운드로 작업을 실행하면 프롬프트가 바로 나옴

  • 예 : sleep 100 &

  • 백그라운드 작업에서 출력하는 부분이 있거나 오류가 발생할 때 주의해야한다.

  • 포그라운드 작업과 출력이 겹칠 수도 있고 오류가 발생했을 때 오류 메시지를 정확하게 읽지 못할 수 있다

  • 백그라운드 작업에서 출력을 해야 할 때는 파일에 출력하는 것이 좋다

# 파일에 출력
find / -name passwd > pw.data 2>&1 &

# 파일 확인
more pw.data

6️⃣ 작업제어

  • 작업 전환, 작업 일시 정지, 작업 종료 등

🔸 작업 전환

  • 포그라운드 작업 -> 백그라운드 작업 으로 전환하거나, 백그라운드 작업 -> 포그라운드 작업 으로 변환

💠 작업 목록 보기

🔸 현재 실행중인 백그라운드 작업 목록 보기

jobs [%작업번호]

  • %번호 : 작업 번호에 해당하는 작업을 조회

  • %+%% :작업 순서가 +인 작업 정보를 출력

  • %- : 작업 순서가 -인 작업 정보를 출력

  • jobs 결과 확인
항목출력 예의미
작업번호[1]작업 번호로 일련번호 형식
작업순서+작업순서를 표시
+ : 가장 최근에 접근한 작업
- : + 전에 접근한 작업
공백 : 그 이외의 작업
상태실행 중작업 상태를 표시
실행중 : 현재 실행 중
완료 : 작업이 정상적으로 종료
종료됨 : 작업이 비정상적으로 종료
멈춤 : 작업이 잠시 중단

💠 작업 전환

명령기능
ctrl + z현재 포그라운드 작업을 잠시 중단
bg %작업번호작업번호가 지시하는 작업을 백그라운드 작업으로 전환
fg %작업번호작업번호가 지시하는 작업을 포그라운드 작업으로 전환


💠 작업 종료

  • 포그라운드 작업 종료 : ctrl + c
  • 포그라운드 강제 종료 : PID 를 찾아 강제 종료 kill PID 또는 kill %작업번호
  • 백그라운드 작업 종료 : kill %작업번호

💠 로그아웃

  • 로그아웃 후에도 백그라운드에서 계속 작업 실행하기
    nohup 명령 &

🔍 실습

  1. sleep 1000 명령 2개를 백그라운드로 실행
sleep 1000 &
sleep 1000 &
  1. 현재 실행중인 백그라운드 작업과 정지된 작업을 조회
jobs

  1. 백그라운드로 실행 중인 1번 작업을 종료
kill %1
jobs

  1. 남아있는 백그라운드 작업을 포그라운드로 전환
fg %2
  1. 포그라운드 작업을 종료
^C


7️⃣ 작업 예약

  • 주기적으로 반복 하거나 특정 시간에 한 번 수행해야 하는 작업을 예약할 수 있다

at [옵션] [시각]

  • 옵션 :

    • l : 현재 실행 대기 중인 명령의 전체 목록을 출력

    • r 작업번호 : 현재 실행 대기 중인 명령 중 해당 작업 번호를 삭제

    • m : 출력 결과가 없더라도 작업이 완료되면 사용자에게 메일로 알려줌 (메일 서버 기능이 있어야 함)

    • f 파일 : 표준 입력 대신 실행할 명령을 파일로 지정

  • 설치: sudo apt install at

  • 시간 설정:

    • today , tomorrow , hours , days , weeks 가능
    • at 4pm + 3days : 지금부터 3일 후 오후 4시에 작업을 수행
    • at 10am Jul 31 : 7월 31일 오전 10시에 작업을 수행
    • at 1am tomorrow : 내일 오전 1시에 작업을 수행
    • at 10:00am today : 오늘 오전 10시에 작업을 수행
  • at 명령 사용 후 종료는 ctrl + d

  • 모든 명령은 절대 경로로 작성해야 한다

🔍 예약 실습

  1. 06:50에
at 06:50 am

위 명령어를 입력하면 at 프롬프트로 들어감

  1. 아래 명령을 수행하도록 설정
/usr/bin/ls -l ~jiwoni > ~jiwoni/at.out
  1. at 명령 사용 종료
    ctrl + d = <EOT>
  2. at.out 파일 생성 확인
    more/at.out

06:50에 파일 생성이 확인 가능하다

💠 at 명령의 작업 파일

  • /var/spool/cron/atjobs 라는 디렉토리에 저장
  • 작업번호 파일로 저장

🔸 작업 파일 확인

  • sudo ls -l /var/spool/cron/atjobs 명령으로 확인하면 작업과 관련된 파일이 생성되는데 이 파일은 예약된 명령이 수행되면 삭제된다.

🔸 예약한 작업 목록 보기

  • at -l
  • atq

🔸 예약된 작업 삭제

  • at -d 작업번호
  • atrm 작업번호

🔍 실습

  1. at 07:20 am 명령어 예약
  2. 작업파일 확인
    작업 전이면 파일이 있지만, 작업이 완료되면 삭제 됨

💠 at 명령 사용 제한

  • 시스템 관리자는 일반 사용자들의 at 명령 사용을 허용하거나 사용하지 못하도록 금지 할 수 있다.
  • 이와 관련된 파일은 /etc/at.allow/etc/at.deny
  • at 명령의 사용이 허용된 사용자들의 아이디를 /etc/at.allow 파일에 작성하고 at 명령의 사용이 금지된 사용자들의 아이디를 /etc/at.deny 파일에 한줄에 하나씩 작성
  • at.allow 파일이 있으면 이 파일의 사용자만 at명령 가능하고 at.deny는 무시
  • at.allow 파일이 없고 at.deny 파일만 존재하면 at.deny 에 작성된 유저를 제외한 모든 유저가 at 명령 사용가능
  • 두 파일 모두 없으면 루트만 at 명령을 사용가능
  • 사용자가 모두 기록되어 있다면 사용가능
  • at.deny 파일이 존재하고 아무런 내용도 없다면 모든 사용자가 at 사용 가능 (✅ 초기설정)

💠 crontab

  • 정해진 시간에 반복실행

crontab [-u 사용자 ID][옵션][파일 경로]

  • 옵션
    • e : 사용자의 crontap
    • l : 파일의 목록을 출력
    • r : crontap 파일을 삭제
  • crontap 파일은 사용자 별로 1개만 생성
  1. 시간 설정

  • 요일 : 일요일이 0

  • 각 항목은 공백으로 구분

  • 항목의 값이 *이면 해당 항목의 모든 값을 의미

  • - 연산자를 이용하면 값의 범위를 지정할 수 있음.
    ex : 요일 필드 1-5 설정 - 월요일부터 금요일까지

  • , 연산자를 이용하면 반복에 대한 값 목록을 정의할 수 있음
    ex : 시간 필드 1,3,5 설정 - 1시 3시 5시

  • /연산자를 이용하면 단계값을 지정할 수 있음
    ex : 분 필드 1-10/2 - 1,3,5,7,9 분에 수행(2분마다 수행)
    ex : */20 - 20분마다 수행

-> 매월 1일 23시 30분에 지정한 작업을 수행

🔍 시간 설정 예시

  • 45 22 * * * : 매일 22시 45분에 수행

  • 0 17 * * 1 : 매주 월요일 17시에 수행

  • 59 23 * * 1-5 : 월요일부터 금요일까지 23시 59분에 수행

  • */10 * * * * : 10분 간격으로 수행

🔸 crontab 편집

crontab -e

2. 10 * * * * /usr/bin/ls -l > ~jiwoni/linux_ex/cron.out 작성
3. 저장 : ctrl + o
4. 종료 : ctrl + x
5. 매일 10분에 명령 수행됨 (cat cron.out 으로 확인)

🔸 crontab 내용 확인

crontab -l

🔸 crontab 실행 확인

ls -l

🔸 crontab 삭제

crontab -r

🔍 crontab 연습 - 정해진 시간에 반복 실행

  1. 현재 날짜 및 시간을 5분 단위로 홈디렉토리에 crontab.out이라는 파일로 출력하도록 작성
*/5 * * * * date > ~jiwoni/linux_ex/crontab.out
  1. 두번 이상 실행되는 지 확인

  1. crontab 삭제
    crontab -r

🔸 crontab 사용제한

  • /etc/cron.allow/etc/cron.deny 파일을 가지고 사용을 제한함

0개의 댓글