서버 접속은 대부분 ssh 사용자명@서버주소 한 줄로 시작합니다. Windows 에서는 PuTTY 나 Windows Terminal 의 ssh 명령을 씁니다. 처음 접속하면 호스트 키 확인 문구가 뜨는데, yes 를 입력해야 다음부터 자동으로 신뢰합니다.
접속에 성공하면 프롬프트가 보입니다. 일반 사용자는 $, root 사용자는 # 으로 끝납니다. 이 한 글자만 봐도 지금 어떤 권한으로 명령을 실행하는지 알 수 있습니다.
RHEL 계열의 기본 셸은 대부분 bash 입니다. 이 레슨의 모든 예제는 bash 문법을 기준으로 합니다.
비밀번호 로그인 대신 키 기반 인증(ssh -i키파일 사용자@서버)을 쓰는 곳도 많습니다. 개인키 파일 권한이 너무 넓으면(644 등) ssh 가 접속을 거부하니, chmod 600 키파일 로 소유자만 읽게 맞춰야 합니다. 사내 보안 규정상 키 발급·폐기 절차가 따로 있는 경우가 대부분이라 담당자에게 먼저 확인합니다.
리눅스는 FHS(Filesystem Hierarchy Standard) 라는 표준 디렉터리 배치를 따릅니다. 배포판이 달라도 아래 경로는 같은 용도로 씁니다.
| 경로 | 용도 |
|---|---|
/etc |
시스템·서비스 설정 파일 |
/var/log |
로그 파일 |
/opt |
서드파티·사내 애플리케이션 |
/home |
사용자 홈 디렉터리 |
/tmp |
임시 파일, 재부팅 시 삭제 가능 |
/proc |
실행 중 프로세스·커널 정보(가상) |
/usr |
배포판이 제공하는 프로그램·라이브러리 |
/etc 는 설정 전용이라 애플리케이션 데이터를 두면 안 됩니다. /var/log 는 로그가 계속 쌓이므로 디스크 용량을 주기적으로 확인해야 합니다. /opt 는 사내 자바 애플리케이션을 두는 관례적인 위치입니다.
/proc 은 디스크가 아니라 커널이 실시간으로 만들어 주는 가상 파일 시스템입니다. /proc/[pid]/status 로 특정 프로세스 정보를 볼 수 있습니다. /tmp 는 재부팅하면 비워질 수 있으니 중요한 파일을 두면 안 됩니다.
pwd 는 현재 위치, cd 는 이동, ls -la 는 숨김 파일까지 포함한 상세 목록입니다. -l 은 자세히, -a 는 숨김 파일 포함, -h 는 용량을 사람이 읽기 쉽게 바꿉니다.
경로 축약 기호도 알아둬야 합니다. ~ 는 홈 디렉터리, . 은 현재 위치, .. 은 한 단계 위, - 은 직전에 있던 디렉터리입니다.
cd /opt/myapp # 이동
cd - # 방금 있던 곳으로 되돌아감이름이 . 로 시작하는 파일은 숨김 파일입니다. .bashrc, .ssh 처럼 설정 파일이 많고, ls 만으로는 안 보이고 ls -a 로만 보입니다.
mkdir -p a/b/c 는 중간 디렉터리가 없어도 한 번에 만듭니다. cp, mv 는 각각 복사와 이동(이름 변경 포함)입니다.
rm -rf 는 디렉터리를 강제로, 확인 없이, 재귀적으로 지웁니다. 되돌릴 방법이 없고, 휴지통도 없습니다. 변수가 비어 있는 상태로 rm -rf "$DIR"/* 를 실행하면 루트 아래 전체를 지울 수 있어 각별히 주의해야 합니다.
mkdir -p releases/v3/{bin,conf,lib,logs} # 배포 폴더 뼈대
cp -r conf/* releases/v3/conf/ # 설정만 복사
mv releases/v3/lib/old.jar /tmp/ # 잘못 올라간 파일 이동
rm -rf releases/v0 # 아주 오래된 배포판 정리새 폴더를 만들 때는 mkdir -p 로 중간 경로까지 한 번에 만드는 습관을 들이면, 상위 폴더가 없어서 실패하는 일이 없습니다. cp -r 은 폴더를 재귀적으로 복사하므로 설정 폴더 전체를 옮길 때 유용합니다.
파일을 이름·크기·수정 시각으로 찾을 때는 find 를 씁니다.
find /opt/myapp -name '*.log' # 이름으로
find . -type f -size +100M # 100MB 초과 파일
find . -mtime -1 # 최근 1일 안에 수정
find /var/log -mtime +30 -exec rm {} \; # 30일 지난 파일 삭제-exec 는 찾은 파일마다 뒤의 명령을 실행하고, {} 자리에 파일 경로가 들어갑니다. 명령어가 어디 있는지 찾을 때는 which java(경로만) 또는 type java(셸 내장인지 실행 파일인지까지) 를 씁니다.
cat 은 파일 전체를 한 번에 출력합니다. 수 GB 짜리 로그에 cat 을 쓰면 터미널이 그대로 멈춘 것처럼 보이니, less 로 페이지 단위로 넘겨 보는 게 안전합니다.
less app.log # q 로 종료, / 로 검색
head -n 50 app.log # 앞 50줄
tail -n 50 app.log # 뒤 50줄
tail -f app.log # 새로 추가되는 로그를 실시간으로tail -f 는 배포 직후 애플리케이션이 정상 기동했는지 확인할 때 가장 많이 쓰는 명령입니다. Ctrl+C 로 빠져나옵니다.
리눅스 파일은 소유자(owner)·그룹(group)·기타(other) 세 대상에 각각 읽기(r)·쓰기(w)·실행(x) 권한을 가집니다. ls -l 출력의 앞 10글자가 이를 보여줍니다.
-rwxr-x--- # 소유자 rwx, 그룹 r-x, 기타 없음| 숫자 | 권한 | 의미 |
|---|---|---|
| 7 | rwx | 읽기+쓰기+실행 |
| 6 | rw- | 읽기+쓰기 |
| 5 | r-x | 읽기+실행 |
| 4 | r-- | 읽기만 |
| 0 | --- | 권한 없음 |
디렉터리의 실행(x) 권한은 "그 안에 들어갈 수 있는지" 를 뜻합니다. 읽기(r) 만 있으면 목록은 보여도 안으로 들어갈 수 없습니다.
chmod 750 file 로 숫자 표기를, chmod u+x file 로 기호 표기를 씁니다. chown app:app file 은 소유자와 그룹을 바꿉니다. umask 는 새로 만드는 파일의 기본 권한에서 얼마를 깎을지 정하는 값입니다.
운영에 필요한 명령만 sudo 로 실행하고, 애플리케이션 자체는 root 가 아니라 전용 서비스 계정(예: app)으로 돌리는 것이 관례입니다. root 로 자바 프로세스를 띄우면 취약점 하나가 서버 전체 장악으로 이어질 수 있습니다.
> 는 덮어쓰기, >> 는 이어쓰기, 2> 는 표준 에러만 파일로 보냅니다. 2>&1 은 표준 에러를 표준 출력과 합치는데, 순서가 중요해 > file 2>&1 처럼 뒤에 와야 합니다.
cmd > out.log 2>&1 # 출력·에러 모두 out.log
cmd > /dev/null 2>&1 # 모두 버림| 는 앞 명령의 출력을 뒤 명령의 입력으로 연결합니다. tee 는 파이프 중간에서 파일로도 저장하면서 화면에도 그대로 보여줍니다.
모든 명령은 끝나면 종료 코드를 남기고, $? 로 바로 직전 명령의 값을 읽습니다. 0 은 성공, 그 외는 실패입니다. && 는 앞이 성공해야, || 는 앞이 실패해야 뒤를 실행합니다.
APP_ENV=dev 처럼 만든 값은 셸 변수라서 그 셸 안에서만 보이고 자식 프로세스는 못 봅니다. export APP_ENV 로 승격해야 bash 로 띄운 자식 프로세스, 즉 java 프로세스까지 값을 물려받습니다.
~/.bashrc 는 로그인할 때마다 실행되는 개인 설정이고, /etc/profile.d/*.sh 는 서버의 모든 사용자에게 적용되는 공통 설정입니다. JAVA_HOME, PATH 같은 값은 보통 /etc/profile.d 에 스크립트로 넣어 관리합니다.
PATH 는 명령을 찾는 디렉터리 목록을 : 로 구분해 담은 변수입니다. 새 경로는 반드시 기존 값 뒤에 덧붙여야 하고(export PATH=$PATH:/opt/jdk/bin), 통째로 덮어쓰면 ls 같은 기본 명령마저 사라집니다.
| 파일 | 적용 대상 | 적용 시점 |
|---|---|---|
~/.bashrc |
현재 사용자 한 명 | 새 셸을 열 때마다 |
/etc/profile.d/*.sh |
서버의 모든 사용자 | 로그인할 때 |
JAVA_HOME, 사내 공통 PATH 처럼 모든 배포 계정이 함께 써야 하는 값은 /etc/profile.d 에 넣습니다. 특정 계정만의 편의 설정(별칭 등)은 그 계정의 ~/.bashrc 에 넣습니다.
심볼릭 링크는 ln -s 대상 링크이름 으로 만듭니다. 배포에서는 releases/v1, releases/v2 처럼 버전 폴더를 두고 current 라는 링크가 최신 버전을 가리키게 하는 패턴을 많이 씁니다. 배포 시 링크만 바꿔치면 되고, 롤백도 링크를 이전 버전으로 되돌리면 끝납니다.
Git Bash 에서는 권한 문제로 ln -s 가 실제 심볼릭 링크 대신 파일 복사로 동작하는 경우가 많습니다. RHEL 서버에서만 진짜 링크로 확인하면 됩니다.
묶고 풀 때는 tar 를 씁니다. tar czf app.tgz app 은 gzip 압축으로 묶고, tar xzf app.tgz -C 대상 은 지정한 폴더에 풉니다. 이미 압축된 파일 하나만 다룰 때는 gzip/gunzip 을 씁니다.
du -sh 디렉터리 는 그 디렉터리가 차지한 용량 합계를 사람이 읽기 쉬운 단위로 보여줍니다. df -h 는 파티션 전체의 사용률을 보여줍니다.
로그가 디스크를 다 채우면 애플리케이션이 파일을 못 써서 장애로 이어집니다. 배포 후에는 df -h 로 여유 공간을 습관적으로 확인해야 합니다.
$ du -sh /opt/myapp/*
128M /opt/myapp/lib
2.3G /opt/myapp/logs
4.0K /opt/myapp/conf
$ df -h /opt
파일시스템 크기 사용 가용 사용% 마운트위치
/dev/sda3 50G 47G 2.1G 96% /opt사용률 96% 처럼 여유가 거의 없으면 오래된 로그부터 정리하거나 담당자에게 증설을 요청해야 합니다. logs 폴더 혼자 2.3G 를 차지하는 위 예시가 전형적인 경고 신호입니다.
명령의 옵션이 기억나지 않으면 man 명령어 로 매뉴얼을 보거나, 명령어 --help 로 요약을 봅니다. 폐쇄망 서버는 인터넷 검색이 안 되므로 man 페이지가 사실상 유일한 문서입니다.
많이 쓰는 명령은 man 내용을 미리 캡처하거나 메모해 두는 것도 방법입니다. man 이 설치 안 된 최소 이미지도 있으니, 없으면 --help 로 대체합니다.