[Linux] 리눅스 프로세스 관리: 개념, 종류, 명령어, cronjob

728x90
반응형

1. 프로세스 개념

1) 개요

  • 리눅스는 다중 프로세스 시스템으로, 실행 중인 프로그램은 프로세스 형태로 관리된다.
  • 프로세스는 부모-자식 관계를 가지고 생성되며, 시스템 프로세스(운영체제가 생성)와 사용자 프로세스(사용자가 생성)로 나눌 수 있다.
  • 리눅스 부팅 시 systemdkthreadd 프로세스가 생성되며, 이 두 프로세스를 제외한 모든 프로세스는 부모 프로세스가 존재한다.
  • 자식 프로세스는 부모 프로세스에 의해 생성되며, 자신의 작업이 종료되면 부모에게 결과를 전달하고 종료된다. 결과는 정상 수행이나 에러로 인한 종료를 구분하기 위한 값이다.
  • 예를 들어, 사용자가 로그인하여 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로 표시된다.

ps -u → 메모리 사용량도 확인 가능

  • S는 대기 중
  • R은 실행 중
  • Z는 좀비

3) 특정 프로세스 검색

특정 프로세스를 검색하고자 할 때는 다음과 같은 방법을 사용할 수 있다.

ps -ef | grep 프로세스이름

상황에 따라 -e-u 옵션을 적절히 사용해야 하며, 내용이 많을 때는 파이프(|)와 grep 검색을 활용하면 유용하다.


4. 프로세스 관리

1) 특정 프로세스 검색

  • 기본 형식: pgrep [옵션] [패턴]
  • 옵션
    • x: 패턴과 일치하는 프로세스의 정보를 출력
    • n: 패턴을 포함하고 있는 가장 최근 프로세스의 정보를 출력
    • u 사용자 이름: 특정 사용자가 수행 중인 모든 프로세스를 출력
    • l: PID와 프로세스 이름 출력
    • t 터미널: 특정 단말기와 연결된 프로세스를 검색
  • 설명: 특정 프로세스를 조회할 때 psgrep을 조합해 사용했지만, pgrep은 이 두 개를 합쳐놓은 명령어이다.

2) 프로세스 종료

  1. 시그널
    • 프로세스에 무언가 발생했음을 알려주는 간단한 메시지
    • 현재 버전의 리눅스에서 사용 가능한 시그널은 kill -l로 확인 가능
    • 주요 시그널:
      • SIGHUP (1): 터미널과 연결이 끊겼을 때 발생, 프로세스 종료
      • SIGINT (2): 인터럽트(CTRL+C) 발생
        • 현재 수행 중인 작업보다 우선순위가 높은 경우에만 중지
      • SIGQUIT (3): 종료 신호, 사용자가 CTRL+\를 입력하면 발생
      • SIGKILL (9): 프로세스를 강제로 종료시키는 시그널, 이 시그널을 받은 프로세스는 무시할 수 없다.
      • SIGALRM (14): 알람에 의해서 발생
      • SIGTERM (15): kill 명령이 보내는 기본 시그널
  2. kill
    • 프로세스 종료 명령
    • 형식: kill [-시그널] PID
  3. pkill
    • 프로세스 이름으로 종료
  4. killall
    • 프로세스 이름으로 종료

3.)top

  • 프로세스 정보를 주기적으로 출력하여 현재 실행 중인 프로세스의 상태를 모니터링할 수 있다.

4) 작업 제어

  1. 포그라운드 작업
    • 사용자가 명령을 입력하면 쉘이 그 명령을 해석해 커널에 전달하여 실행.
    • 특징: 명령이 수행되는 동안 프롬프트가 나타나지 않기 때문에 다른 명령을 입력할 수 없다.
    • 예시: sleep 100 명령을 실행하면 100초 후에 프롬프트가 돌아온다.
  2. 백그라운드 작업
    • 다른 프로세스를 실행하는 동안 뒤에서 실행되는 작업.
    • 실행 방법: 작업 뒤에 &를 추가하여 실행.
    • 예시: sleep 100 &를 실행하면 프롬프트가 즉시 돌아온다. pgrep 명령어로 실행 중인 프로세스를 확인 가능
  3. jobs
    • 모든 백그라운드 작업을 조회하는 명령.
    • 형식: jobs [%작업번호]
    • 출력 예시: [1]+ 실행 중 sleep 100 &
  4. 작업 전환
    • Ctrl + z: 포그라운드 작업 중지
    • bg %작업번호: 작업 번호가 지시하는 작업을 백그라운드로 전환
    • fg %작업번호: 백그라운드 작업을 포그라운드로 전환
  5. 계속 실행
    • 일반적인 작업은 로그아웃 시 종료.
    • 로그아웃 후에도 계속 작업을 수행하려면 nohup 명령 &로 실행하면 된다.

백그라운드 작업 예시
100초 동안 현재 스레드를 중지시키는 프로세스를 백그라운드로 실행하고 실행 중인지 확인


5) cronjob (작업 예약)

  1. 작업 예약 방법
    • 운영체제에서 제공하는 기능 사용
    • 프로그래밍 언어로 프로그램 작성
    • 응용 프로그램의 기능 이용
    • 쿠버네티스의 크론잡 기능 활용
  2. 정해진 시간에 한번만 실행
    • at 명령으로 설정.
    • 형식:
    • at [옵션] [시각] 작업 내용
    • 옵션
      • l: 현재 실행 대기 중인 명령 목록 출력
      • r 작업번호: 작업번호에 해당하는 작업 삭제
      • m: 작업 완료 시 사용자에게 메일로 알림
      • f 파일경로: 작업 내용을 파일에서 수행
  3. 시간 설정 방법
    • at 시간: 지정한 시간에 동작
      • 예시: at 16:00 pm, at 1 am tomorrow, at 1 am jul 31, at 4 pm + 3days
  4. 작업 확인 명령
    • ls -l /var/spool/cron/atjobs
  5. 실습 예시
    • 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

  1. 개요
    • systemd는 리눅스의 시스템과 서비스 관리를 위한 도구로, 유닉스의 init을 대체.
    • 서비스 데몬 시작, 프로세스 상태 유지 및 시스템 상태 관리 기능 제공.
  2. unit
    • 서비스 종류를 구분하기 위한 개념.
    • 관리 대상의 이름을 서비스명.유닛종류 형태로 관리.
    • 주요 종류:
      • service: 시스템 서비스 유닛
      • target: 유닛 그룹화
      • socket: 소켓 관리
  3. 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
반응형