DevOps 5일차 - 프로세스 관리

문한성·2023년 3월 13일
0

부트캠프

목록 보기
7/123
post-thumbnail

프로세스, 스레드, 멀티 스레드

프로세스(Process)

실행중인 프로그램으로, 운영체제로부터 자원을 할당받아 실행되는 단위입니다. 각 프로세스는 독립적으로 메모리 영역을 할당받아 실행되며, 서로 다른 프로세스 간에는 메모리 공유가 불가능합니다.

스레드(Thread)

프로세스 내에서 실행되는 실행 단위입니다. 프로세스 내에서 동작하는 스레드들은 같은 메모리 공간을 공유하며, 하나의 프로세스 내에서 다수의 스레드가 동시에 실행될 수 있습니다. 스레드는 프로세스의 자원을 공유하기 때문에, 여러 스레드 간에 데이터를 공유하고 처리 속도를 높일 수 있습니다.

멀티스레딩(Multithreading)

하나의 프로세스 내에서 여러 개의 스레드를 동시에 실행하는 것을 말합니다. 멀티스레딩은 여러 스레드가 동시에 실행되는 것처럼 보이지만, 실제로는 각 스레드가 CPU를 번갈아가며 사용하면서 실행됩니다. 멀티스레딩을 사용하면 병렬처리를 통해 성능을 향상시키고, 프로그램의 응답성을 높일 수 있습니다. 하지만 멀티스레딩을 구현하는 것은 복잡하고, 스레드 간의 경합 조건 등 다양한 문제점을 고려해야 합니다.

프로세스 관리 - ps, pstree

포그라운드

포그라운드 모드는 사용자와 상호작용이 가능한 모드로, 프로세스가 실행되는 동안 사용자는 해당 프로세스가 끝날 때까지 기다립니다. 즉, 해당 프로세스가 실행 중일 때에는 다른 작업을 수행하지 못하며, 해당 프로세스의 작업이 끝날 때까지 기다려야 합니다.

예를 들어, 사용자가 워드프로세서를 실행하면 해당 프로그램에 대한 프로세스가 생성되고, 사용자는 해당 프로그램이 종료될 때까지 프로그램의 실행을 기다립니다.

백그라운드

백그라운드 모드는 프로세스가 실행되면서 사용자와의 상호작용이 필요하지 않은 모드로, 해당 프로세스가 실행되는 동안 다른 작업을 수행할 수 있습니다. 즉, 해당 프로세스가 실행 중일 때에도 다른 작업을 수행할 수 있으며, 해당 프로세스의 작업이 끝나지 않아도 다른 작업을 수행할 수 있습니다.

예를 들어, 사용자가 파일 다운로드를 시작하면 해당 다운로드 프로그램에 대한 프로세스가 생성되고, 다운로드가 완료될 때까지 해당 프로세스가 백그라운드 모드에서 실행됩니다. 사용자는 파일을 다운로드하는 동안 다른 작업을 수행할 수 있습니다.

백그라운드 방식은 명령어 뒤에 &를 붙여서 실행하고, 다른 명령어를 추가적으로 입력할 수 있습니다. 하지만 백그라운드 방식으로 실행해도 사용자의 터미널 세션이 종료되면 실행중인 프로세스도 종료됩니다. 작업시간이 오래 걸리는 작업인 경우 nohup 명령어를 이용하여 백그라운드로 실행하면 사용자의 터미널 세션이 종료되어도 작업이 종료될 때까지 프로세스를 실행합니다.

# 포그라운드 방식
$ command
$ ping google.com

# 백그라운드 방식 -- &추가
$ command &
$ ping google.com &

# nohup 커맨드(no hang up)
$ nohup command &
$ nohup ping google.com &

ps

ps 명령어는 다음과 같이 사용할 수 있습니다:

ps [옵션]

일반적으로 사용되는 옵션은 다음과 같습니다:

  • e: 시스템 전체에서 실행 중인 모든 프로세스를 표시합니다.
  • f: 상세 정보를 표시합니다. PID, PPID, CPU 사용량, 시작 시간, 명령어 등을 표시합니다.
  • u: 사용자 이름과 함께 프로세스를 표시합니다.
  • l: 긴 형식으로 출력합니다. PID, PPID, 상태, CPU 사용량, 메모리 사용량, 시작 시간, 명령어 등을 표시합니다.

예를 들어, ps -ef 명령어를 사용하여 모든 프로세스를 상세 정보와 함께 표시할 수 있습니다.

출력 예시:

UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0  2021 ?        00:00:09 /sbin/init
root          2      0  0  2021 ?        00:00:00 [kthreadd]
root          3      2  0  2021 ?        00:00:00 [rcu_gp]
root          4      2  0  2021 ?        00:00:00 [rcu_par_gp]
root          6      2  0  2021 ?        00:00:00 [kworker/0:0H-kblockd]
...
  • aux: 시스템 전체에서 실행 중인 모든 프로세스를 표시합니다.
    • a: 현재 로그인한 사용자와 관계없이 모든 사용자의 프로세스를 보여줍니다.
    • u: 각 프로세스의 세부 정보를 보여줍니다.
    • x: 터미널에 연결된 것과 무관하게 실행 중인 모든 프로세스를 보여줍니다.

pstree

리눅스에서 실행 중인 프로세스들의 부모-자식 관계를 보여주는 명령어입니다. pstree 명령어는 보통 프로세스가 어떻게 실행되는지 이해하는 데 도움이 됩니다.

pstree 명령어를 실행하면 현재 실행 중인 모든 프로세스가 부모-자식 관계에 따라 들여쓰기(indentation)로 구분되어 출력됩니다. 각각의 들여쓰기는 부모 프로세스를 나타내며, 해당 부모 프로세스 아래에 들어있는 자식 프로세스들이 들여쓰기 없이 출력됩니다.

예를 들어, pstree를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

cssCopy code
systemd─┬─accounts-daemon───2*[{accounts-daemon}]
        ├─agetty
        ├─atd
        ├─cron
        ├─dbus-daemon
        ├─2*[dhclient]
        ├─dockerd─┬─containerd───7*[{containerd}]
        │         └─2*[{dockerd}]
        ├─2*[getty]
        ├─irqbalance───{irqbalance}
        ├─lvmetad───2*[{lvmetad}]
        ├─networkd-dispat───{networkd-dispat}
        ├─polkitd───2*[{polkitd}]
        ├─rsyslogd─┬─{rsyslogd}
        │          ├─{rsyslogd}
        │          ├─{rsyslogd}
        │          └─{rsyslogd}
        ├─snapd───9*[{snapd}]
        ├─sshd───sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-resolve
        ├─systemd-timesyn───{systemd-timesyn}
        ├─systemd-udevd
        ├─udisksd───3*[{udisksd}]
        └─upowerd───2*[{upowerd}]

이 출력은 시스템에서 실행 중인 프로세스들을 나타내며, systemd 프로세스가 최상위 부모 프로세스인 것으로 나타납니다. 이 밑에는 accounts-daemon, agetty, atd, cron 등의 자식 프로세스들이 있으며, 또 다시 그 아래에는 accounts-daemon이 자식으로 가지는 2개의 자식 프로세스가 보입니다. 이런 식으로, 각각의 들여쓰기 수준마다 부모-자식 관계가 나타나게 됩니다.

프로세스 관리 - kill

리눅스에서 "kill"은 프로세스나 작업을 강제로 종료시키는 명령어입니다. 일반적으로 "kill" 명령어는 다음과 같이 사용됩니다.

  1. 특정 프로세스 ID(PID)에 대해 "kill" 명령어를 사용하여 해당 프로세스를 종료시킵니다.
kill PID
  1. "kill" 명령어와 함께 "-9" 옵션을 사용하여 강제 종료합니다.
kill -9 PID
kill -9 %작업번호

위의 명령어는 해당 PID의 프로세스를 강제로 종료시킵니다. 그러나 이러한 강제 종료는 파일 시스템 불일치 및 기타 문제를 초래할 수 있으므로 가능하면 일반적인 "kill" 명령어를 사용하는 것이 좋습니다.

  • kill -l 을 이용해 사용할 수 있는 시그널의 종류를 확인가능

  • 예시
    • SIGHUP : 재시작할 때 사용
    • SIGINT : 실행 중지 시그널, Ctrl + c
    • SIGKILL : 프로세스 강제 종료
    • SIGTERM : 프로세스 정상종료 (기본 명령)
    • SIGCONT : 정지된 프로세스 실행
    • SIGSTOP : 터미널에서 입력되는 정지 시그널
    • SIGTSTP : 실행 정지 후 재실행 대기, Ctrl+ z

프로세스 관리 - jobs

jobs 명령어는 현재 실행중인 작업의 목록을 보여주는 명령어입니다.

사용 방법은 다음과 같습니다.

  • 터미널에서 실행중인 작업을 멈추고 백그라운드로 보낼 작업을 실행합니다.
  • jobs 명령어를 입력합니다.
  • 현재 실행중인 작업의 번호, 상태, 실행중인 명령어 등의 정보가 출력됩니다.
  • 백그라운드에서 실행중인 작업을 다시 포그라운드로 가져오려면 해당 작업의 번호를 입력하여 fg 명령어를 실행합니다.

아래는 jobs 명령어의 사용 예시입니다.

$ sleep 10 &
[1] 1234

$ ls -l
total 0

$ jobs
[1]+  Running                 sleep 10 &

$ fg 1
sleep 10
profile
기록하고 공유하려고 노력하는 DevOps 엔지니어

0개의 댓글