[Physical AI W1D2] 2/6 — 리눅스 실전 8 시나리오: 명령어를 손에 익히기

2026. 6. 14. 17:13·피지컬AI

[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 — 큰 것부터 상위 N
  • sort | 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
'피지컬AI' 카테고리의 다른 글
  • [Physical AI W1D2] 4/6 — ROS 2 토픽 직접 만들기: Publisher·Subscriber
  • [Physical AI W1D2] 3/6 — ROS 2 통신의 4가지 길: 노드·토픽·서비스·액션
  • [Physical AI W1D2] 1/6 — 리눅스 기초 체력: 쉘·파일시스템·핵심 명령어
  • [Physical AI W1D1] 5/5 — ROS 2 /clock을 밖으로: WebSocket 서버 + Cloudflare Tunnel
hyeseong-dev
hyeseong-dev
안녕하세요. 백엔드 개발자 이혜성입니다.
  • hyeseong-dev
    어제 오늘 그리고 내일
    hyeseong-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (342) N
      • 여러가지 (11) N
        • 알고리즘 & 자료구조 (73)
        • 오류 (4)
        • 이것저것 (29)
        • 일기 (1)
      • 프레임워크 (39)
        • 자바 스프링 (39)
        • React Native (0)
      • 프로그래밍 언어 (39)
        • 파이썬 (31)
        • 자바 (3)
        • 스프링부트 (5)
      • 컴퓨터 구조와 운영체제 (3)
      • DB (17)
        • SQL (0)
        • Redis (17)
      • 클라우드 컴퓨팅 (21)
        • 도커 (2)
        • AWS (19)
      • 스케쥴 (65)
        • 세미나 (0)
        • 수료 (0)
        • 스터디 (24)
        • 시험 (41)
      • 트러블슈팅 (1)
      • 자격증 (2) N
        • 정보처리기사 (0)
        • 정보보안기사 (1)
        • 네트워크관리사 (1) N
      • 재태크 (0)
        • 암호화폐 (0)
        • 기타 (0)
      • 피지컬AI (26)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    celery
    클라우드
    로봇팔
    자바
    완전탐색
    FastAPI
    Redis
    TF
    AWS네트워크계층으로읽기
    프로그래머스
    피지컬ai
    네트워크
    docker
    그리디
    rclpy
    SAA
    취업리부트
    동차변환행렬
    역운동학
    EC2
    항해99
    Python
    운동학
    WebFlux
    Spring Boot
    ROS2
    java
    AWS
    Spring WebFlux
    moveit
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
[Physical AI W1D2] 2/6 — 리눅스 실전 8 시나리오: 명령어를 손에 익히기
상단으로

티스토리툴바