우분투 실전 명령어 | ln -s 심볼릭 링크 안전 교체

배포 경로를 자주 바꾸는 서비스는 실제 파일을 직접 덮어쓰기보다 심볼릭 링크로 현재 버전을 가리키는 방식이 훨씬 안전합니다. ln -s를 제대로 쓰면 롤백이 빨라지고, 운영 중 실수를 줄일 수 있습니다.

언제 쓰는가

  • 릴리스 디렉터리를 날짜/버전 단위로 분리해 운영할 때
  • 설정 파일 위치를 표준 경로(/etc/...)에 고정하고 실제 파일은 다른 경로에 둘 때
  • 블루그린 배포처럼 현재 활성 버전을 링크 하나로 전환하고 싶을 때

바로 쓰는 명령어

# 기본 심볼릭 링크 생성
ln -s /opt/myapp/releases/2026-02-19 /opt/myapp/current

# 링크 대상 확인
ls -l /opt/myapp/current
readlink -f /opt/myapp/current
# 기존 링크를 새 릴리스로 안전하게 교체
ln -sfn /opt/myapp/releases/2026-02-20 /opt/myapp/current

# 링크 교체 후 서비스 재시작
systemctl restart myapp
systemctl status myapp --no-pager

핵심 옵션/패턴

  • -s는 심볼릭 링크를 만듭니다. 디렉터리나 파일 모두 다룰 수 있어 배포에 가장 많이 씁니다.
  • -f는 기존 파일/링크가 있으면 덮어씁니다.
  • -n은 대상이 디렉터리 링크일 때 링크 자체를 교체하게 해 줍니다.
  • 운영에서는 ln -sfn <new> <current> 패턴을 표준으로 고정해 두면 실수 확률이 크게 줄어듭니다.

명령 출력 예시

$ ls -l /opt/myapp/current
lrwxr-xr-x  1 root root 33 Feb 19 01:30 /opt/myapp/current -> /opt/myapp/releases/2026-02-20
$ readlink -f /opt/myapp/current
/opt/myapp/releases/2026-02-20

자주 하는 실수

  • ln -s만 쓰고 교체 시 -f -n을 빼서 링크가 중첩되거나 의도와 다르게 생성되는 경우
  • 상대 경로 링크를 만들어 작업 디렉터리가 바뀌면 깨지는 경우
  • 링크만 바꿔 놓고 서비스 재기동이나 헬스체크를 생략해 장애를 늦게 발견하는 경우

검증 방법

# 1) 링크 대상 확인
readlink -f /opt/myapp/current

# 2) 바이너리/설정 접근 확인
test -x /opt/myapp/current/bin/start.sh && echo OK

# 3) 서비스 상태 및 최근 로그 확인
systemctl status myapp --no-pager
journalctl -u myapp -n 50 --no-pager

링크 대상이 기대한 릴리스와 다르면 즉시 이전 릴리스로 다시 ln -sfn 하여 롤백하고, 로그로 초기화 실패 원인을 확인합니다.

운영 팁

  • 릴리스 디렉터리는 불변으로 두고 current 링크만 변경하세요. 변경 이력이 명확해집니다.
  • 배포 스크립트에 readlink -f 검증 단계를 강제로 넣으면 사람 실수를 초기에 차단할 수 있습니다.
  • 롤백 절차를 문서화해 두면 야간 장애에서도 복구 시간이 크게 줄어듭니다.

출처

  • GNU coreutils manual
  • Ubuntu Manpage: ln(1)
  • The Linux Documentation Project