[Physical AI W1D2 · 2/6]
명령어 하나하나가 아니라 "문제 해결의 흐름"으로 익힌다. 웹 디렉토리 세팅·로그 분석·프로세스 관리·디스크 정리·권한·네트워크 진단·파이프 조합·서비스 관리까지, 실무에서 그대로 쓰는 8개 시나리오를 따라 친다.
이 글에서 직접 해보는 것
- CLI 프로그램이 인자를 받는 원리(argc/argv)
- 실전 시나리오 8개: 디렉토리 세팅 · 로그 분석 · 프로세스 · 디스크 · 권한 · 네트워크 · 파이프 · 서비스
- 작은 명령들을 조합해 실제 문제를 푸는 감각
(이 글은 1편 — 리눅스 기초에서 이어집니다. 1편의 개별 명령들을 이번엔 실제 상황으로 굴립니다.)
들어가며 — 명령은 "조합"할 때 강해진다
1편에서 ls, grep, ps, chmod, | 같은 명령을 따로 봤습니다. 하지만 실무에서 명령은 혼자 쓰이지 않습니다. "로그에서 에러만 골라 개수를 세고 파일로 저장", "디스크가 꽉 찼는데 어디가 범인인지 찾기" 같은 흐름으로 씁니다.
이번 편은 그 흐름 8개를 따라 칩니다. Colab 터미널이나 Ubuntu에서 그대로 실행되며, 명령마다 주석(#)으로 의도를 적어 두었습니다.
시나리오 0 — CLI 프로그램은 인자를 어떻게 받나 (argc/argv)
ros2 run pkg node --param value처럼 우리가 치는 명령에는 옵션과 인자가 붙습니다. 프로그램이 이걸 받는 원리가 C의 argc(인자 개수)와 argv(인자 배열)입니다. 핵심 패턴만 보면:
int main(int argc, char *argv[]) {
// argv[0]은 프로그램 이름, argv[1..]는 사용자가 준 인자
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0) {
print_help(); // 도움말
return 0;
}
else if (strcmp(argv[i], "-f") == 0 || strcmp(argv[i], "--file") == 0) {
filename = argv[i + 1]; // 다음 인자를 값으로
i++; // 값은 처리했으니 건너뛰기
}
// ... -v, -d, -n 등 동일 패턴
else {
printf("알 수 없는 옵션: %s\n", argv[i]);
return 1;
}
}
}
Colab에서 직접 컴파일·실행해 볼 수 있습니다.
# 1) %%writefile cli_program.c 로 C 파일 생성 (Colab 셀)
# 2) 컴파일
gcc cli_program.c -o program
# 3) 다양한 옵션으로 실행
./program # 인자 없음 → 도움말
./program -h # 도움말
./program --version # 버전
./program -d -f test.txt # 디버그 + 파일
./program --debug --file data.txt --number 42 --list # 여러 옵션 조합
./program -x # 잘못된 옵션 → 에러 처리
- 왜 보나:
ros2 run ... --ros-args -p name:=value같은 명령도 결국 이 argc/argv 위에서 동작합니다. "옵션을 순회하며 해석"하는 패턴은 모든 CLI의 공통 뼈대입니다.
시나리오 1 — 웹 프로젝트 디렉토리 세팅
새 프로젝트의 폴더 구조를 한 번에 만드는 흐름입니다.
# 1. 홈으로 이동
cd ~
# 2. 폴더 구조 한 번에 생성 (중괄호 확장)
mkdir -p myproject/{src,public,logs,backup}
# 3. 생성 확인
ls -l myproject/
# 4. heredoc으로 파일 생성
cat > myproject/public/index.html << EOF
<html>
<body><h1>Hello Ubuntu!</h1></body>
</html>
EOF
# 5. 내용 확인
cat myproject/public/index.html
{src,public,logs,backup}— 중괄호 확장(brace expansion). 한 줄로 폴더 4개를 만듭니다.cat > 파일 << EOF … EOF— heredoc. 여러 줄 텍스트를 그대로 파일에 써넣는 표준 기법(ROS 설정 파일·스크립트 만들 때 자주 씁니다).
시나리오 2 — 로그 파일 분석
서버/로봇 로그에서 에러를 찾고 집계하는 흐름입니다.
# 1. 샘플 로그 생성
cat > /tmp/app.log << EOF
2024-01-01 INFO 서버 시작됨
2024-01-01 ERROR 데이터베이스 연결 실패
2024-01-01 INFO 재연결 시도 중
2024-01-01 ERROR 타임아웃 발생
2024-01-02 ERROR 디스크 공간 부족
EOF
# 2. ERROR 줄만 필터링
grep "ERROR" /tmp/app.log
# 3. 에러 개수 세기
grep "ERROR" /tmp/app.log | wc -l # → 3
# 4. 날짜 + 에러 조합 필터
grep "2024-01-02" /tmp/app.log | grep "ERROR"
# 5. 에러만 별도 파일로 저장
grep "ERROR" /tmp/app.log > /tmp/errors_only.log
grep | wc -l— "조건에 맞는 줄 개수 세기"의 정석. 로봇 로그에서[ERROR]/[WARN]빈도를 빠르게 파악할 때 그대로 씁니다.
시나리오 3 — 프로세스 모니터링 & 관리
특정 서비스(노드)가 살아 있는지 확인하고 관리하는 흐름입니다.
# 1. 실행 중 Python 프로세스 확인
ps aux | grep python
# 2. grep 자기 자신 제외하고 보기
ps aux | grep nginx | grep -v grep
# 3. 메모리 많이 쓰는 Top 5
ps aux --sort=-%mem | head -6
# 4. PID로 종료 / 강제 종료
kill 1234
kill -9 1234
# 5. 이름으로 한 번에 종료
killall python3
# 6. 실시간 모니터링(3초 간격)
top -d 3
grep -v grep—ps | grep X하면 grep 명령 자신도 잡히는데, 그걸 빼는 관용구.- 로봇 실습에서 노드가 안 죽고 포트를 쥐고 있을 때
ps aux | grep node→kill(또는 1편의pkill -f)로 정리합니다.
시나리오 4 — 디스크 & 파일 정리
디스크가 꽉 찼을 때 범인을 찾는 흐름입니다.
# 1. 전체 디스크 사용량
df -h
# 2. 어느 폴더가 큰지
du -sh /var/*
# 8.5G /var/log ← 여기가 문제!
# 3. 로그 폴더에서 큰 파일 Top 10
du -sh /var/log/* | sort -rh | head -10
# 4. 30일 이상 된 로그 삭제
find /var/log -name "*.log" -mtime +30 -delete
# 5. 100MB 이상 큰 파일 전체 검색
find / -type f -size +100M 2>/dev/null
du … | sort -rh | head— "큰 것부터 정렬해 상위 몇 개"의 정석(-r역순,-h사람이 읽는 크기).find … 2>/dev/null— 권한 없는 곳의 에러 메시지를 버려(2>/dev/null) 결과만 깔끔히 봅니다.
시나리오 5 — 파일 권한 & 보안 (쉘 스크립트 만들기)
쉘 스크립트를 만들고 실행 가능하게 만드는 흐름입니다.
# 1. 스크립트 생성
cat > ~/backup.sh << 'EOF'
#!/bin/bash
echo "백업 시작: $(date)"
cp -r ~/myproject ~/myproject_backup
echo "백업 완료!"
EOF
# 2. 현재 권한 확인 (실행권한 x 없음)
ls -l ~/backup.sh
# -rw-r--r-- ← x 없음
# 3. 실행 권한 부여
chmod +x ~/backup.sh
# 4. 변경 확인 (-rwxr-xr-x)
ls -l ~/backup.sh
# 5. 실행
./backup.sh
#!/bin/bash(셰뱅) — "이 스크립트는 bash로 실행하라"는 첫 줄 지시.- 새로 만든 스크립트는 기본적으로 실행권한이 없으므로
chmod +x후./script.sh로 실행합니다(1편 함정 ③).
시나리오 6 — 네트워크 진단
서버 연결 문제를 단계적으로 진단하는 흐름입니다.
# 1. 인터넷 연결
ping -c 4 google.com # -c 4: 4번만
# 2. 내 IP 확인
ip addr show | grep "inet "
# 3. 열린 포트 확인(22·80·443 등)
sudo ss -tuln | grep LISTEN # 권장(기본 설치)
# sudo netstat -tuln | grep LISTEN # netstat은 net-tools 설치 필요: sudo apt install -y net-tools
# 4. 파일 다운로드 / API 확인
wget -O /tmp/test.zip https://example.com/file.zip
curl -s https://api.example.com/status | grep "ok"
# 5. 원격 접속 / 파일 전송
ssh ubuntu@192.168.1.200
scp ~/backup.sh ubuntu@192.168.1.200:/home/ubuntu/
- 로봇을 원격 PC/홈랩에서 다룰 때
ssh(접속)·scp(파일 전송)·netstat(포트 확인)은 매일 씁니다. Day1의 Cloudflare Tunnel도 "내 포트를 밖으로"라는 같은 문제를 푸는 도구였습니다.
시나리오 7 — 파이프 활용 실전
파이프(|)로 명령을 조합하는 강력한 예제들입니다.
# 1. .py 파일 줄 수 Top 5
find . -name "*.py" | xargs wc -l | sort -rn | head -5
# 2. 가장 많이 쓴 명령어 Top 10
history | awk '{print $2}' | sort | uniq -c | sort -rn | head -10
# 3. 특정 포트 사용 프로세스
sudo netstat -tulnp | grep :8080
# 4. 에러 로그 실시간 모니터링(ERROR만, 색상)
tail -f /var/log/syslog | grep --color "ERROR"
find | xargs— find 결과를 다음 명령의 인자로 넘기기. 대량 파일 처리의 핵심.sort | uniq -c | sort -rn— "빈도 집계 후 많은 순 정렬"의 황금 조합. 로그 IP·명령어 통계 등에 그대로 씁니다.tail -f | grep— 실시간 로그에서 원하는 것만 — 로봇 노드 디버깅의 단골.
시나리오 8 — 패키지 설치 & 서비스 관리
개발 환경을 설치하고 서비스를 관리하는 흐름입니다.
# 1. 목록 업데이트
sudo apt update
# 2. 필요한 도구 한 번에
sudo apt install -y curl git vim htop
# 3. Node.js 설치
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
node -v && npm -v # 설치 확인
# 4. 서비스 시작/중지/재시작 (systemd)
sudo systemctl start nginx
sudo systemctl restart nginx
sudo systemctl enable nginx # 부팅 시 자동 시작
sudo systemctl status nginx # 상태 확인
# 5. 불필요한 패키지 정리
sudo apt autoremove -y
systemctl— 리눅스의 서비스(데몬) 관리 도구. 로봇 시스템을 "부팅 시 자동 실행"으로 띄울 때systemctl enable을 씁니다.apt install -y—-y는 "확인 질문에 모두 yes". 스크립트·자동화에서 필수.
2편 정리 — 흐름으로 익힌 리눅스
8개 시나리오에서 반복된 조합 패턴:
grep | wc -l— 조건 줄 개수du … | sort -rh | head— 큰 것부터 상위 Nsort | uniq -c | sort -rn— 빈도 집계find | xargs— 대량 파일 처리tail -f | grep— 실시간 필터 모니터링cat > 파일 << EOF— 파일 생성(heredoc)chmod +x→./script.sh— 스크립트 실행
이 패턴들은 ROS 2 실습에서도 그대로 등장합니다(로그 보기, 프로세스 정리, 설정 파일 만들기). 손에 붙이면 로봇 디버깅 속도가 확 빨라집니다.
다음 편 예고
여기까지가 리눅스 몸풀기입니다. 3편부터는 본격적으로 ROS 2로 들어갑니다. 로봇 소프트웨어가 왜 하나의 거대 프로그램이 아니라 여러 노드로 쪼개져 서로 통신하는지 — 노드·토픽·서비스·액션 4가지 통신 방식을 개념부터 잡습니다.
📚 Week1 Day2 전체 목차 (총 6편)
- 1/6 리눅스 기초 — 쉘·파일시스템·핵심 명령어
- 2/6 리눅스 실전 8 시나리오 — 이번 글
- 3/6 ROS 2 통신 4종 개념 — 노드·토픽·서비스·액션
- 4/6 ROS 2 토픽 Pub/Sub 직접 만들기
- 5/6 ROS 2 서비스·액션 구현
- 6/6 ROS 2 패키지 빌드 — Python·C++·colcon
'피지컬AI' 카테고리의 다른 글
| [Physical AI W1D2] 4/6 — ROS 2 토픽 직접 만들기: Publisher·Subscriber (0) | 2026.06.14 |
|---|---|
| [Physical AI W1D2] 3/6 — ROS 2 통신의 4가지 길: 노드·토픽·서비스·액션 (0) | 2026.06.14 |
| [Physical AI W1D2] 1/6 — 리눅스 기초 체력: 쉘·파일시스템·핵심 명령어 (0) | 2026.06.14 |
| [Physical AI W1D1] 5/5 — ROS 2 /clock을 밖으로: WebSocket 서버 + Cloudflare Tunnel (1) | 2026.06.14 |
| [Physical AI W1D1] 4/5 — Colab에서 ROS 2 Humble + Gazebo headless 환경 만들기 (0) | 2026.06.14 |