Windows 개발자가 로컬에서 리눅스 명령을 연습할 때는 Git Bash 나 WSL 을 씁니다. 둘은 비슷해 보여도 차이가 있습니다.
| 항목 | Git Bash | WSL |
|---|---|---|
| 커널 | Windows 위 에뮬레이션 | 진짜 리눅스 커널 |
| 심볼릭 링크 | 대부분 복사로 동작 | 정상 동작 |
| 권한(rwx) | 의미 없이 표시만 | 실제로 적용 |
| 용도 | 가벼운 명령 연습 | 서버와 동일한 환경 검증 |
이 레슨 예제 스크립트는 Git Bash 에서도 돌아가도록 만들었지만, 링크·권한 관련 결과는 실제 서버와 다를 수 있습니다. 권한과 링크를 정확히 검증하려면 WSL 이나 실제 RHEL 서버에서 확인해야 합니다.
Git Bash 는 Windows 실행 파일(git.exe, ssh.exe 등)을 유닉스 스타일 명령으로 감싼 것이라 설치가 가볍고 바로 쓸 수 있습니다. 대신 chmod, ln -s 처럼 리눅스 커널 기능에 의존하는 명령은 흉내만 낼 뿐 실제 권한·링크 시스템콜을 호출하지 않습니다. 이 레슨을 Git Bash 로 먼저 연습하고, 권한과 링크가 실제로 걸리는지는 서버에서 최종 확인하는 흐름을 권합니다.
인터넷이 되는 환경에서는 scp 로 파일을 서버에 바로 올립니다.
scp target/myapp.jar app@server01:/opt/myapp/releases/v3/
scp -r conf/ app@server01:/opt/myapp/releases/v3/폐쇄망 서버는 외부 접속 자체가 막혀 있어 scp 를 바로 못 씁니다. 반입 매체(USB, 사내 파일 서버)로 jar 를 옮긴 뒤 내부망에서 다시 scp/sftp 로 서버에 전달하는 절차를 거칩니다. 파일 하나하나에 반입 승인 이력을 남기는 조직도 많습니다.
대화형으로 여러 파일을 올릴 때는 sftp app@server01 로 접속해 put, get, ls 명령을 씁니다. put myapp.jar /opt/myapp/releases/v3/ 처럼 원격 경로를 지정합니다.
tar czf conf_backup_$(date +%Y%m%d).tgz -C /opt/myapp conf # 백업
tar xzf conf_backup_20260910.tgz -C /opt/myapp_restore # 복원-C 옵션으로 작업 디렉터리를 바꾸면 tar 안에 절대 경로가 남지 않아, 다른 서버에 복원할 때도 경로가 꼬이지 않습니다. 배포 직전 conf, bin 폴더를 통째로 백업해 두면 롤백이 명령 한 줄로 끝납니다.
tar tzf conf_backup_20260910.tgz # 풀기 전에 내용물만 미리 확인
diff -r conf /opt/myapp_restore/conf # 복원 후 원본과 동일한지 확인압축을 풀기 전에 tar tzf 로 목록만 먼저 보면, 엉뚱한 백업 파일을 실수로 푸는 것을 막을 수 있습니다. 복원 후에는 diff -r 로 폴더 두 개를 통째로 비교해 누락이 없는지 확인합니다.
sudo -u app /opt/myapp/bin/start.sh # app 계정 권한으로 실행
sudo systemctl status myapp # 서비스 상태 조회는 sudo 필요자바 프로세스 자체는 app 계정으로 띄우고, 그 계정에는 /opt/myapp 아래에만 쓰기 권한을 줍니다. sudo 는 서비스 재시작처럼 시스템 전역에 영향을 주는 명령에만 쓰고, 애플리케이션 실행에는 쓰지 않는 것이 원칙입니다.
find /opt/myapp/logs -name '*.log' -mtime +30 -exec rm {} \;
find /opt/myapp/logs -name '*.log' -mtime +30 -print0 | xargs -0 rm두 명령은 결과가 같지만 방식이 다릅니다. -exec 는 찾은 파일마다 rm 을 매번 새로 실행하고, xargs 는 목록을 모아 적은 횟수로 실행해 파일이 많을 때 더 빠릅니다. -print0/-0 조합은 파일명에 공백이 있어도 안전합니다.
삭제처럼 되돌릴 수 없는 작업은 먼저 -delete 대신 -print 로 지울 목록만 눈으로 확인한 뒤 실행하는 습관을 들입니다.
find /opt/myapp/logs -name '*.log' -mtime +30 -print # 1) 목록만 먼저 확인
find /opt/myapp/logs -name '*.log' -mtime +30 -exec rm {} \; # 2) 확인 후 삭제