Linux 패키지 관리 및 작업 제어 – 연습 문제
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로 작업을 확인하면 작업 ID와 PID(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는 파이프라인이 두 개의 프로세스(
yes와head)를 만들더라도 하나의 작업 ID만 보고합니다. 두 PID가 동일한 작업 아래에 나열됩니다.
요약 체크리스트
-
jobs와jobs -l을 사용하여 작업을 나열합니다. -
&를 사용해 백그라운드 작업을 시작합니다. -
fg를 사용해 작업을 포그라운드로 가져옵니다. -
Ctrl+Z로 일시 중지하고bg로 재개합니다. -
kill을 사용해 작업을 종료합니다. - 파이프라인은 하나의 작업으로 간주된다는 점을 확인합니다.
추가 읽을거리
- Bash Reference Manual – Job Control
man bash→ JOB CONTROL 섹션man kill,man fg,man bg,man jobs
Exercise 1 – Job vs Process (Foreground job)
Goal
job과 process가 무엇인지, 그리고 파이프라인이 단일 job으로 계산되는 이유를 이해합니다.
Task
ping -c 5 google.com | wc -l
Observe
- 두 개의 프로세스가 생성됩니다:
ping과wc. - 하나의 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
- 다시 로그인합니다.
- 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 – 패키지 다운그레이드
-
패키지의 사용 가능한 모든 버전을 나열합니다:
dnf list python3 --showduplicates -
원하는 버전으로 다운그레이드합니다 (
<VERSION>을 원하는 정확한 릴리스로 교체하세요):sudo dnf downgrade python3-<VERSION>
연습 36 – 일시적인 업그레이드 제외
sudo dnf upgrade --exclude=python3*
Part 8 – Automatic Updates
Exercise 37 – Enable Automatic Updates
-
Install the
dnf-automaticpackage:sudo dnf install dnf-automatic -
Enable and start the timer:
sudo systemctl enable --now dnf-automatic.timer
Exercise 38 – Configure Security‑Only Updates
-
Open the configuration file for editing:
sudo vi /etc/dnf/automatic.conf -
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가 더 최신입니다.