오늘 오전은 실습 위주로 진행되었다.
실습 너 무 좋 ㅇ ㅏ ~
내가 어느 부분에서 부족한지 한눈에 보이고
근육지식을 활용하거나 팀원들에게 알려주고 물어보면서
하나하나 해결해가는 과정이 뿌듯했다.

어제는 구축까지 진행했다.





||의 의미: 앞 명령이 실패하면 뒤 명령을 실행
여기서 /는 루트(root) 디렉터리, 곧 리눅스 파일 시스템의 맨 꼭대기 경로
df에 넘기는 인자로 루트가 들어 있는 디스크의 용량만 보여 달라는 의미

이제 또 다른 개인 실습의 시작이다
이 문제들은 교수님이 공유해주신 노션에 있다 !!

테크노트를 쓰고 있는 이 시점은 8번을 하고 있다 . . .
더이상 머리에 정보가 안들어온다.

L01. 내 작업 폴더 찾아가기
pwd
/home/hs/Developments/ai-campus/linux-submission-lab
cd data
ls
app.conf app.log fruits.txt metrics.csv users.txt
cd ~ # 홈으로
cd - # 직전 위치로 돌아오기
ls -al
backup data reports scripts submission work
cd - 는 바로 전에 있던 폴더로 돌아가는 것.
홈 갔다가 다시 돌아올 때 경로를 다시 안 쳐도 돼서 편하다.
L02. 파일을 복사해서 따로 보관하기
# work/project/docs 에서
touch todo.txt
cp todo.txt todo_copy.txt
ls
todo.txt todo_copy.txt
mv todo_copy.txt ../done.txt # 옮기면서 이름 바꾸기
# 실습 폴더에서
cp data/app.conf work/service.conf
cp data/app.conf backup/app.conf
# work 에서
touch delete_me.txt
rm delete_me.txt
mv 하나로 옮기기랑 이름 바꾸기가 같이 된다.../done.txt 처럼 경로 끝에 새 이름을 붙이면 옮기면서 이름까지 바뀐다.
L03. 기록을 읽고 짧은 메모 남기기
head -n 2 app.log
2026-10-17 09:00:00 INFO service_started
2026-10-17 09:01:00 INFO healthcheck_ok
tail -n 2 app.log
2026-10-17 09:10:00 INFO recovery_completed
2026-10-17 09:11:00 INFO service_ready
wc -l app.log
12 app.log
head 는 앞에서부터, tail 은 뒤에서부터.wc -l 은 줄 수.
메모 파일은 touch work/log_memo.txt 로 만들고 cat 으로 다시 읽어봤다.
L04. 필요한 내용만 골라서 저장하기
grep ERROR data/app.log
2026-10-17 09:03:00 ERROR database_timeout
2026-10-17 09:06:00 ERROR prediction_failed
2026-10-17 09:09:00 ERROR upstream_unavailable
grep ERROR data/app.log > error.txt
grep WARN data/app.log > reports/waring.txt
과일 이름별 등장 횟수는 힌트가 sort, uniq -c 였다.
sort data/fruits.txt | uniq -c
3 apple
2 banana
1 orange
sort data/fruits.txt | uniq -c > reports/fruits_count.txt
-> 어려웠는데 스스로 해결했다 !
metrics.csv 는 맨 위 제목 줄을 빼고 첫 번째 열만 세야 했다.
tail -n +2 data/metrics.csv | sort | cut -c 1 | uniq -c
2 a
2 w
tail -n +2 는 2번째 줄부터 끝까지 보여주는 것. 제목 줄이 빠진다.
-> 이것도 어려웠는데 스스로 해결했다 !
mode=training 을 mode=practice 로 바꾸는 건 블로그의 도움을 받았다.
sed 's/training/practice/g' work/app.practice.conf
app=demo-service
mode=practice
s/찾을것/바꿀것/ 이 바꾸기 문법이다.
Q. sed 말고 설정 파일을 바꾸는 방법은?
여러 가지 있었다.
스크립트로 자동화할 때는 결국 sed -i 를 제일 많이 쓴다고 한다.-i 를 붙이면 화면에만 보여주는 게 아니라 파일에 바로 저장된다.
그래서 원본을 지키려면 -i 없이 쓰고 > 로 다른 파일에 저장해야 한다.
L05. 파일의 실행 허용 표시와 오류 안내 확인하기
ls -ld work/log_memo.txt
-rw-r--r-- 1 hs hs 0 Oct 21 13:46 work/log_memo.txt
chmod 744 work/log_memo.txt
ls -ld work/log_memo.txt
-rwxr--r-- 1 hs hs 0 Oct 21 13:46 work/log_memo.txt
chmod 644 work/log_memo.txt
-rw-r--r-- 1 hs hs 0 Oct 21 13:46 work/log_memo.txt
rwx 숫자가 기억이 안 나서 검색해보았다.
r = 4
w = 2
x = 1
7 = 4+2+1 (rwx)
6 = 4+2 (rw-)
4 = 4 (r--)
일반 출력과 오류 안내를 따로 저장하는 문제도 있었다.
bash data/missing.log 1> reports/stdout.txt 2> reports/stderr.txt
ls reports/
fruits_count.txt stderr.txt stdout.txt text_files.txt warning.txt
1> 은 일반 출력, 2> 는 오류 출력.2>&1 뭐 이런 명령어라는 건 알았는데 정확하게 개념을 확립하지 못한 상태였다.
실행 허용 표시랑 실제로 실행 가능한지의 차이는 이렇게 적었다.
실행 허용 표시 : 실행 권한 여부
파일 내용이 실제로 실행 가능한지 : 소스 파일이 정상적으로 실행되는지에 따라 다르다
L06. 내가 시작한 작업을 확인하고 끝내기
sleep 300 을 터미널 뒤에서 실행하라고 했다.
터미널 뒤가 백그라운드인지 찾아봤다.
처음엔 sleep 자체가 백그라운드 용어인 줄 알았다.sleep 은 그냥 정해진 초만큼 기다리는 프로그램이다.
sleep 300 : 포그라운드. 300초 동안 터미널이 멈춘다
sleep 300 &: 백그라운드. 바로 다음 명령을 칠 수 있다
끝에 붙인 & 가 백그라운드로 실행하라는 표시이다.
sleep 300 &
[1] 4443
jobs -l
[1]+ 4443 Running sleep 300 &
kill 4443
[1]+ Terminated sleep 300
jobs 만 치면 작업 번호만 나오고, -l 을 붙이면 PID 까지 같이 나온다.kill 은 이름은 무섭지만 기본은 종료 요청(SIGTERM)을 보내는 것이다.
Q. 작업 번호와 PID의 차이는?
작업 번호는 지금 쓰고 있는 터미널이 백그라운드 작업마다 붙여주는 순번이다.
[1] 4443 에서 [1] 이 작업 번호, 4443 이 PID.kill %1 이랑 kill 4443 은 같은 걸 끈다.
다른 터미널 창에서는 jobs 에 안 보이니까 그때는 PID 로 찾아야 한다.
Q. ps aux | grep train | grep -v grep 에서 grep -v 를 붙이는 이유?
grep -v 는 일치하는 줄을 빼고 나머지만 보여주는 것.
ps aux | grep train 만 치면 grep train 명령 자기 자신도 프로세스라서 목록에 같이 찍힌다.
그래서 grep -v grep 으로 그 줄을 빼는 것이다.
ps aux : 모든 사용자의 프로세스를 자세히 보기
a 모든 사용자 / u 사용자 중심 형식 / x 터미널에 안 붙은 것까지
Q. || 의 의미는?
앞 명령이 실패하면 뒤 명령을 실행.
ps aux | grep train | grep -v grep || echo "실행중없음"
grep 은 찾으면 성공(0), 못 찾으면 실패(1)를 돌려준다.
파이프로 이은 건 맨 마지막 명령 결과로 판단한다.
그래서 train 이 안 돌고 있으면 실행중없음 이 찍힌다.
A || B : A 가 실패하면 B
A && B : A 가 성공하면 B
Q. df -h / 에서 / 의 의미는?
여기서 / 는 루트(root) 디렉터리, 곧 리눅스 파일 시스템의 맨 꼭대기 경로다.df 에 넘기는 인자로, 루트가 들어 있는 디스크의 용량만 보여 달라는 의미.
df -h / | tail -1 은 제목 줄을 버리고 실제 정보 한 줄만 남기는 것이다.
L06 4번에서는 실습 폴더가 있는 저장 공간을 봐야 해서 / 대신 . 을 넣었다.
df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/sdd 1007G 4.2G 952G 1% /
du -sh reports
20K reports
처음엔 du -sh . 로 남은 용량을 보려고 했다.du 는 폴더가 쓰고 있는 양이고, df 의 Avail 이 남은 양이다.
du : disk usage, 내 짐이 차지한 부피
df : disk free, 창고에 남은 빈 공간
리눅스 부분은 다 검색해서 풀었다.
근데 검색어가 잘 기억나지 않는다.
L07. 여러 파일을 한 묶음으로 보관하고 다시 풀기
tar -zcvf archive.tar.gz data
data/
data/metrics.csv
data/users.txt
data/app.log
data/fruits.txt
data/app.conf
tar -ztvf archive.tar.gz
drwxr-xr-x hs/hs 0 2026-10-21 13:11 data/
-rw-r--r-- hs/hs 56 2026-10-21 13:11 data/metrics.csv
-rw-r--r-- hs/hs 24 2026-10-21 13:11 data/users.txt
-rw-r--r-- hs/hs 500 2026-10-21 13:11 data/app.log
-rw-r--r-- hs/hs 39 2026-10-21 13:11 data/fruits.txt
-rw-r--r-- hs/hs 31 2026-10-21 13:11 data/app.conf
mkdir work/restored && tar -zxvf archive.tar.gz -C work/restored
복원된 파일이 원본이랑 같은지는 줄 수로 비교했다.
wc -l data/app.conf && wc -l data/app.log && wc -l work/restored/data/app.conf && wc -l work/restored/data/app.log
2 data/app.conf
12 data/app.log
2 work/restored/data/app.conf
12 work/restored/data/app.log
풀었는데 ls 가 그대로였다
처음에 -C 없이 실습 폴더에서 바로 tar -zxvf archive.tar.gz 를 쳤다.
파일 이름은 쭉 찍히는데 ls 를 해보면 바뀐 게 없었다.
원인은 data 폴더가 원래부터 있었기 때문이다.
새 폴더가 생긴 게 아니라 기존 data/ 안의 파일을 덮어쓴 것이다.
tar 는 같은 이름이 있으면 묻지도 않고 덮어쓴다.
그래서 다른 폴더에 풀려면 -C 를 붙여야 한다.
Q. -C 에는 이미 있는 폴더만 쓸 수 있을까?
있는 폴더만 된다.
-C 는 그 폴더로 이동(Change directory)한 다음 푸는 것이라 없는 폴더면 에러가 난다.
tar -zxvf archive.tar.gz -C newdir
tar: newdir: Cannot open: No such file or directory
그래서 mkdir -p 랑 && 로 묶는다.
mkdir -p newdir && tar -zxvf archive.tar.gz -C newdir
-p 는 폴더가 이미 있어도 에러를 안 내니까 그냥 항상 이렇게 쓰면 된다.
Q. zcvf, ztvf, zxvf 의 차이는?
압축하는 명령어랑 압축 푸는 명령어랑 압축파일 안에 뭐가 있는지 확인하는 명령어가 너 무 너 무 너 무 헷갈린다.
알고 보니 z, v, f 는 셋 다 똑같고 가운데 글자 하나만 다르다.
압축파일 묶는 명령어 : tar -zcvf archive.tar.gz <압축할 파일>
안에 뭐가 있는지 확인 : tar -ztvf <압축 파일>
압축파일 푸는 명령어 : tar -zxvf <압축파일> -C <푸는 경로>
c, t, x 는 같이 못 쓴다. 셋 중 하나만 고르는 것이다.z v f 는 고정이고 가운데만 c(만들기) / t(목록) / x(꺼내기) 로 바꾼다고 외워야겠다.
Q. tar 와 tar.gz, 그리고 zip 의 차이는?
.tar 는 묶기만 한 것, .tar.gz 는 묶고 나서 gzip 으로 압축까지 한 것이다.tar 는 원래 tape archive 의 줄임말이라고 한다.
리눅스 서버끼리 주고받을 때는 tar.gz, 윈도우 쓰는 사람한테 보낼 때는 zip.
압축하는 명령어랑 압축 푸는 명령어랑 압축파일 안에 뭐가 있는지 확인하는 명령어가 너 무 너 무 너 무 헷갈린다
압축파일 묶는 명령어 : tar -zcvf archive.tar.gz <압축할 파일>
압축파일에 어떤 파일이 있는지 확인하는 명령어 : tar -ztvf <압축 파일>
압축파일 푸는 명령어 : tar -zxvf <압축파일> -C <압축파일 푸는 경로>


L08. 조사 결과를 한 번에 제출하기
mkdir -p submission/linux/final
touch submission/linux/final/{errors,summary,fruits_count}.txt
cp data/app.log submission/linux/final/app_original.log
grep ERROR submission/linux/final/app_original.log > submission/linux/final/error.txt
touch 뒤에 {a,b,c} 를 쓰면 파일 여러 개가 한 번에 생긴다.
중괄호 안에 띄어쓰기를 넣으면 안 된다.
전체 줄 수, ERROR 줄 수, WARN 줄 수를 summary.txt 에 적는 문제.
wc -l app_original.log > summary.txt
grep -c ERROR app_original.log >> summary.txt
grep -c WARN app_original.log >> summary.txt
cat summary.txt
12 app_original.log
3
2
grep -c 는 일치하는 줄 수만 세는 것.
첫 줄은 > 로 새로 쓰고 나머지는 >> 로 덧붙였다.
wc -l 뒤에 파일명을 붙였더니
처음엔 한 줄로 이렇게 쳤다.
grep ERROR app_original.log | wc -l app_original.log >> summary.txt
이러면 ERROR 줄 수가 아니라 전체 줄 수가 또 찍힌다.wc -l 뒤에 파일 이름을 적으면 파이프로 넘어온 grep 결과를 무시하고 그 파일을 다시 센다.
파이프로 받을 거면 wc -l 뒤에 파일명을 빼야 한다.
아니면 처음부터 grep -c 를 쓰면 된다.
사담
테크노트를 쓰고 있는 이 시점은 L8번을 하고 있다 . . .
더이상 머리에 정보가 안 들어온다.
2>&1 은 아직 개념이 확실하지 않다.
1>, 2> 로 나누는 건 해봤는데 둘을 합치는 건 다시 봐야겠다.
L08 남은 문제는 이어서 풀 예정이다.