우분투 실전 명령어 | readlink realpath로 심볼릭 링크와 실제 경로 추적하기

우분투 실전 명령어 | readlink realpath로 심볼릭 링크와 실제 경로 추적하기

배포 디렉터리나 로그 경로를 심볼릭 링크로 운영하다 보면, "지금 실제로 어느 파일을 보고 있는지"가 헷갈릴 때가 많습니다. readlink와 realpath를 익혀두면 링크 체인과 실제 경로를 빠르게 확인해서 장애 원인 파악이 훨씬 빨라집니다.

언제 쓰는가

  • Nginx/PHP-FPM 배포에서 current 심볼릭 링크가 어느 릴리스를 가리키는지 확인할 때
  • 설정 파일 링크가 상대 경로라서 서비스 재시작 후 경로 오류가 날 때
  • 백업/정리 스크립트에서 링크 자체를 지울지 실제 파일을 지울지 구분해야 할 때

바로 쓰는 명령어

# 링크가 가리키는 1단계 대상 확인
readlink /srv/app/current

# 링크 체인을 끝까지 따라가 실제 파일 확인
readlink -f /srv/app/current/config/app.yml

# 경로를 절대 경로로 정규화
realpath ./current/../current/config/app.yml
# 링크인지 먼저 판별하고 대상 출력
target="/srv/app/current"
if [ -L "$target" ]; then
  echo "link -> $(readlink "$target")"
  echo "resolved -> $(readlink -f "$target")"
else
  echo "not a symlink"
fi

핵심 옵션/패턴

  • readlink PATH: 링크의 직접 대상만 출력 (상대 경로 그대로 나올 수 있음)
  • readlink -f PATH: . .. 및 링크 체인을 따라 최종 절대 경로 출력
  • realpath PATH: 사람이 읽기 쉬운 절대 경로 정규화 결과 확인
  • 운영에서는 "직접 대상"과 "최종 대상"을 같이 기록하면 추적이 쉬움
# 장애 기록용: 원본/직접대상/최종대상 한 번에 남기기
p="/srv/app/current"
printf "path=%s\n" "$p"
printf "direct=%s\n" "$(readlink "$p" 2>/dev/null || echo '-')"
printf "final=%s\n" "$(readlink -f "$p" 2>/dev/null || echo '-')"

명령 출력 예시

$ ls -l /srv/app/current
lrwxrwxrwx 1 root root 24 Feb 19 01:10 /srv/app/current -> /srv/app/releases/20260219

$ readlink /srv/app/current
/srv/app/releases/20260219

$ readlink -f /srv/app/current/config/app.yml
/srv/app/releases/20260219/config/app.yml

자주 하는 실수

  • 실수 1: readlink 결과가 상대 경로인데 절대 경로라고 착각해서 후속 스크립트가 다른 위치를 참조함
  • 실수 2: 링크를 삭제해야 하는 상황에서 rm -rf $(readlink -f path)를 써서 실제 데이터까지 지워버림
  • 실수 3: 컨테이너/호스트 경로 기준을 섞어 보고 잘못된 경로를 정상으로 판단함

검증 방법

# 테스트용 링크 체인 만들고 결과 비교
mkdir -p /tmp/rl/a /tmp/rl/b
ln -sfn /tmp/rl/b /tmp/rl/a/current
ln -sfn /tmp/rl/a/current /tmp/rl/live

readlink /tmp/rl/live
readlink -f /tmp/rl/live
realpath /tmp/rl/live
# 링크/실체를 함께 점검
namei -l /tmp/rl/live
stat /tmp/rl/live
stat "$(readlink -f /tmp/rl/live)"

운영 팁

  • 배포 스위치 직전/직후에 readlink -f current 결과를 로그로 남기면 롤백 판단이 빨라집니다.
  • 정리 스크립트에는 "링크만 삭제" 단계와 "실데이터 삭제" 단계를 분리해 사고를 줄이세요.
  • 모니터링 알림에 링크 최종 대상 경로를 포함하면 야간 장애 대응 시간이 짧아집니다.

출처

  • GNU Coreutils
  • Ubuntu Manpages
  • Linux man-pages project