Linux 패키지 관리 및 작업 제어 – 연습 문제

발행: (2025년 12월 27일 오전 08:33 GMT+9)
14 min read
원문: Dev.to

I’m happy to translate the article for you, but I need the actual text you’d like translated. Could you please paste the content (or the portion you want translated) here? I’ll keep the source line unchanged and preserve all formatting, markdown, and code blocks as requested.

Exercise 1 – Job vs Process

Goal

Bash에서 작업프로세스가 무엇인지, 그리고 파이프라인이 단일 작업으로 간주되는 이유를 이해한다.

Background

  • Process – 실행 중인 프로그램의 인스턴스로, PID로 식별됩니다.
  • Job – Bash가 함께 관리하는 하나 이상의 프로세스 집합(예: 파이프라인).
  • Bash는 각 작업에 작업 ID(%1, %2, …)를 할당하며, 이를 작업 제어 내장 명령(fg, bg, jobs, kill)으로 참조할 수 있습니다.

Part 1 – Bash Jobs & Process Control

1️⃣ 현재 작업 목록 보기

jobs
  • 작업이 표시되지 않으면 먼저 몇 개의 백그라운드 작업을 시작하세요(2단계 참고).

2️⃣ 백그라운드 작업 시작하기

# 간단한 sleep 명령
sleep 60 &          # 작업 %1
sleep 120 &        # 작업 %2

# 파이프라인 (단일 작업으로 간주)
yes | head -n 1000000 > /dev/null &
  • jobs -l 로 작업을 확인하면 작업 IDPID(s) 를 모두 볼 수 있습니다.

3️⃣ 작업을 포그라운드로 가져오기

fg %1   # 원하는 작업 ID로 %1을 교체
  • 명령이 터미널을 차지하고, 작업이 끝나거나 Ctrl+Z 로 중단될 때까지 기다립니다.

4️⃣ 포그라운드 작업을 중단하고 백그라운드에서 재개하기

# 포그라운드에서 작업이 실행 중일 때 Ctrl+Z 를 누릅니다
# Bash는 다음과 비슷하게 보고합니다: [1]+  Stopped   sleep 60

bg %1   # 중단된 작업을 백그라운드에서 재개
  • jobs -p 를 사용하면 백그라운드 작업의 PID만 목록으로 볼 수 있습니다.

5️⃣ 작업 종료하기

kill %2          # 작업 %2에 SIGTERM 전송
kill -9 %2       # 정상 종료되지 않을 경우 강제 종료
  • jobs 로 작업이 사라졌는지 확인합니다.

6️⃣ 파이프라인이 단일 작업임을 확인하기

# 백그라운드에서 파이프라인 시작
{ yes | head -n 500000 > /dev/null; } &
jobs -l
  • Bash는 파이프라인이 두 개의 프로세스(yeshead)를 만들더라도 하나의 작업 ID만 보고합니다. 두 PID가 동일한 작업 아래에 나열됩니다.

요약 체크리스트

  • jobsjobs -l을 사용하여 작업을 나열합니다.
  • &를 사용해 백그라운드 작업을 시작합니다.
  • fg를 사용해 작업을 포그라운드로 가져옵니다.
  • Ctrl+Z로 일시 중지하고 bg로 재개합니다.
  • kill을 사용해 작업을 종료합니다.
  • 파이프라인은 하나의 작업으로 간주된다는 점을 확인합니다.

추가 읽을거리

  • Bash Reference Manual – Job Control
  • man bashJOB CONTROL 섹션
  • man kill, man fg, man bg, man jobs

Exercise 1 – Job vs Process (Foreground job)

Goal

jobprocess가 무엇인지, 그리고 파이프라인이 단일 job으로 계산되는 이유를 이해합니다.

Task

ping -c 5 google.com | wc -l

Observe

  • 두 개의 프로세스가 생성됩니다: pingwc.
  • 하나의 job이 생성됩니다: 전체 파이프라인이 단일 명령으로 취급됩니다.

Why it matters

  • Bash 작업 제어는 개별 프로세스가 아니라 job을 대상으로 동작합니다.
  • 이를 알면 파이프라인을 디버깅하거나 관리할 때 도움이 됩니다.

Exercise 2 – 포그라운드 작업이 셸을 차단함

작업

ping google.com

명령을 실행한 뒤 다른 명령을 입력해 보세요.

관찰

  • 셸이 차단됩니다.
  • 모든 키보드 입력이 ping 프로세스로 전달됩니다.

중지 방법

Ctrl + C 를 누르세요.

실제 적용 관련

장시간 실행되는 포그라운드 명령은 자동화 스크립트를 차단하고 이후 명령 실행을 방해할 수 있습니다.

Exercise 3 — 백그라운드 작업 (&)

작업

ping -c 10 google.com &

관찰

  • 쉘이 즉시 프롬프트로 돌아옵니다.
  • ping 출력이 비동기적으로 계속 나타납니다.

작업 목록 확인

jobs

왜 중요한가

출력을 적절히 처리하지 않고 백그라운드에서 명령을 실행하면 터미널이나 로그 파일이 어수선해질 수 있습니다. 필요에 따라 작업 제어(jobs, fg, bg, kill)를 사용하거나 출력을 리다이렉트하세요.

Exercise 4 – Redirect Background Output

Task

ping -c 10 google.com > ping.log &

Observe

  • 터미널 잡음이 없습니다.
  • 출력이 ping.log에 안전하게 캡처되었습니다.

Production relevance

백그라운드 작업의 출력을 리다이렉트하는 것은 프로덕션 환경에서 표준적인 관행입니다.

연습 5 — /dev/null 사용

작업

ping google.com > /dev/null &

관찰

  • 명령의 출력이 완전히 버려집니다.

이유

출력이 필요 없는 상태 확인이나 keep‑alive 스크립트에 유용합니다.

Exercise 6 — 작업 목록

작업

jobs

여러 작업 시작

ping google.com > /dev/null &
ping bing.com   > /dev/null &

관찰

작업 ID(\[1\], \[2\], …) 가 표시됩니다.

Exercise 7 – Bringing a Job to the Foreground (fg)

Task

fg %1

Stop it

Press Ctrl + C.

Key rule

Only foreground jobs receive keyboard signals.

Exercise 8 — Suspending a Job (Ctrl + Z)

Task

ping google.com
# press Ctrl+Z
jobs

Observe

Job state: Stopped.

Exercise 9 — 백그라운드에서 작업 재개 (bg)

Task

bg %1
jobs

Observe

  • 작업이 다시 실행됩니다.
  • 여전히 키보드 입력을 받지 않습니다.

Source:

Exercise 10 — 작업 종료

작업

kill %1

강제 종료

kill -9 %1

프로덕션 관련성

실행 중인 작업을 안전하게 종료합니다.

Exercise 11 — wait 명령

작업

ping -c 5 google.com > /dev/null &
ping -c 5 bing.com   > /dev/null &
wait
echo "All jobs finished"

관찰

echo는 두 ping 명령이 끝난 후에만 실행됩니다.

이유

쉘 스크립트에서 wait을 사용한 병렬 실행 제어를 보여줍니다.

연습 12 – wait -n (작업이 완료될 때)

작업

ping -c 10 google.com > /dev/null &
ping -c 3 bing.com   > /dev/null &
wait -n
echo "One job finished"

Exercise 13 — 터미널 벨을 이용한 알림

Task

ping -c 5 google.com > /dev/null &
wait
tput bel
echo "Download complete"

왜?
수동으로 실행하는 장시간 작업이 끝났을 때 청각적인 알림을 제공합니다.

연습 14 — nohup 로그아웃 후 지속

작업

nohup ping -c 30 google.com > nohup.out &
exit
  1. 다시 로그인합니다.
  2. ping 프로세스가 여전히 실행 중인지 확인합니다:
ps aux | grep ping

관찰

ping 작업은 로그아웃 후에도 계속 실행됩니다.

실제 적용

사용자 세션이 종료된 후에도 지속되어야 하는 원격 서버 작업에 유용합니다 (예: 장시간 실행 스크립트, 백그라운드 서비스).

연습 15 — 부모 프로세스 변경 (재부모화)

작업

ps -o pid,ppid,cmd -p <pid>

관찰

로그아웃 후, 부모 PID가 1(init 프로세스)로 변경됩니다.

Part 2 — RPM (Low‑Level Package Management)

Exercise 16 – Inspect RPM Without Installing

rpm -qpl zsh*.rpm

패키지에 의해 설치될 파일들을 나열합니다.

Exercise 17 — Manual RPM Install

sudo rpm -i zsh*.rpm

의존성 해결을 수행하지 않습니다.

Exercise 18 – RPM Removal

sudo rpm -e zsh

자동 의존성 처리나 설정 파일 관리가 없기 때문에 RPM만 사용하면 운영 환경에서 위험할 수 있음을 보여줍니다.

Part 3 — DNF Core Usage

Exercise 19 — Search Packages

dnf search links

Exercise 20 — Install with Dependencies

sudo dnf install links

Exercise 21 — Remove Package

sudo dnf remove links

Exercise 22 — Repository Awareness

dnf info neofetch

Shows which repository provides the package.

Part 4 — 리포지터리 (BaseOS, AppStream, …)

Exercise 23 – List Repositories

dnf repolist

Exercise 24 – Enable CRB

sudo dnf config-manager --set-enabled crb

Exercise 25 – Enable EPEL

sudo dnf install epel-release

Install htop

sudo dnf install htop

Part 5 – 의존성 분석

Exercise 26 – 패키지가 제공하는 것

dnf repoquery --provides bash

Exercise 27 – 패키지가 요구하는 것

dnf repoquery --requires bash

Exercise 28 – 패키지를 요구하는 패키지

dnf repoquery --whatrequires bash

Exercise 29 – 약한 의존성 (추천)

dnf repoquery --recommends gimp

Exercise 30 – 약한 의존성 없이 설치

sudo dnf install gimp --setopt=install_weak_deps=False

Exercise 31 – 역방향 약한 의존성 (보완)

dnf repoquery --what-supplements langpacks-de

Source:

Part 6 — 의존성 제거 위험

Exercise 32 — 의존성 자동 제거 문제

# Install Matplotlib (which pulls in NumPy)
sudo dnf install python3-matplotlib

# Verify NumPy works
python3 -c "import numpy"

# Remove Matplotlib
sudo dnf remove python3-matplotlib

# Verify NumPy again
python3 -c "import numpy"

python3-matplotlib을 제거한 뒤 애플리케이션이 깨지는 이유는 numpy의존성으로 설치되었고, 함께 자동으로 제거되었기 때문입니다.

Exercise 33 — dnf mark install을 사용한 해결 방법

# Install NumPy explicitly
sudo dnf install python3-numpy

# Mark it as a manually‑installed package so it isn’t auto‑removed
sudo dnf mark install python3-numpy

# Now remove Matplotlib safely
sudo dnf remove python3-matplotlib

python3-numpy를 수동으로 설치된 패키지로 표시하면, 해당 패키지(python3-matplotlib)를 제거하더라도 시스템에 남아 있습니다.

Part 7 – 업데이트, 다운그레이드 및 버전 잠금

연습 34 – 시스템 업그레이드

sudo dnf upgrade

연습 35 – 패키지 다운그레이드

  1. 패키지의 사용 가능한 모든 버전을 나열합니다:

    dnf list python3 --showduplicates
  2. 원하는 버전으로 다운그레이드합니다 ( <VERSION>을 원하는 정확한 릴리스로 교체하세요):

    sudo dnf downgrade python3-<VERSION>

연습 36 – 일시적인 업그레이드 제외

sudo dnf upgrade --exclude=python3*

Part 8 – Automatic Updates

Exercise 37 – Enable Automatic Updates

  1. Install the dnf-automatic package:

    sudo dnf install dnf-automatic
  2. Enable and start the timer:

    sudo systemctl enable --now dnf-automatic.timer

Exercise 38 – Configure Security‑Only Updates

  1. Open the configuration file for editing:

    sudo vi /etc/dnf/automatic.conf
  2. Set the following options (place them under the appropriate section, e.g., [commands]):

    upgrade_type = security
    apply_updates = yes

Note: 새로운 설정은 타이머가 다음에 실행될 때 적용됩니다. 업데이트를 즉시 적용하려면 sudo dnf-automatic --upgrade를 실행하면 됩니다.

Part 9 — DNF 모듈

연습 39 – 모듈 목록 보기

dnf module list

연습 40 – Node.js 스트림 활성화

sudo dnf module enable nodejs:18
sudo dnf upgrade
node --version

연습 41 – 모듈 프로파일 설치

sudo dnf module install nodejs:18/development

연습 42 – 모듈 프로파일 제거

sudo dnf module remove nodejs:18/development

연습 43 – 모듈 비활성화 및 재설정

sudo dnf module disable nodejs
sudo dnf module reset nodejs

Part 10 — 의존성 충돌 디버깅

Exercise 44 — 손상된 RPM 설치

sudo dnf install https://example.com/foreign.rpm

분석

누락된 의존성을 다음 명령으로 확인하십시오:

dnf repoquery --whatprovides <package-name>

Part 11 — Snap 패키지

Exercise 45 – Snap 설치

sudo dnf install snapd
sudo systemctl enable --now snapd.socket

Exercise 46 – Snap을 통해 Firefox 설치

sudo snap install firefox
snap run firefox

Exercise 47 – 버전 비교

firefox --version
snap run firefox --version

Snap 버전의 Firefox가 더 최신입니다.

Back to Blog

관련 글

더 보기 »