✅ 해결 방법만 보고 싶으신 분은 아래 🌞 문제 해결 만 읽으셔도 됩니다
💥 문제 발생
나름 평화로운 오늘 아침, 개발 서버(banana라고 해볼까)가 모종의 이유로 재부팅 되어 pm2로 실행시켜 둔 것들(API, Storybook 등..)이 다 내려갔다. 새로 오신지 얼마 되지 않은 백엔드 분이 자신의 계정으로 개발 서버에 접속 후, API관련 프로젝트가 있는 pineapple라는 폴더에 root 권한으로 접속하여 프로젝트를 실행 pm2 list를 쳤는데 명령어를 찾을 수 없다고 뜬다고 하시는 것..! 심지어 더 문제는 안되겠다 pm2를 설치하자! 했는데 npm명령어도 못 찾는다는?!
[root@banana pineapple]# pm2 list
-bash: pm2: 명령어를 찾을 수 없음
[root@banana pineapple]# npm --version
-bash: npm: 명령어를 찾을 수 없음
그런데 나는 내 계정으로 접속하고 root로 계정 전환 후 pineapple계정에 가서 pm2 list를 쳤는데 왠걸 너무 잘된다. npm --version도 잘 나온다.
[root@banana pineapple]# pm2 list
┌────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
└────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
[root@banana pineapple]# npm --version
10.9.0
분명 전에 다 전역으로 설치한거 같은데 뭐가 문제지? 하고 다른 두 개발자 동료들의 계정으로 똑같은 방법으로 테스트를 해보았다. 근데 한 명은 되고, 한 명은 안된다. 2 vs 2의 상황.. 무엇이 문제인가 깊은 고민에 빠지게 되었는데...
🩺 문제 파악
내 계정을 grape라고 해보겠다. 그리고 동료 2명의 계정은 각각 apple(pm2가 실행되는 동료), orange(pm2가 실행 안되는 동료)라고 해보자.
일단 나는 몇 달 전이지만 pm2나 기타 등등 패키지들을 npm을 사용해를 실행하기 위한 라이브러리들을 전역으로 설치했던 기억이 있다. 그래서 일단 전역으로 설치된 npm 패키지가 무엇이 있는지 확인해보기 위해 npm list -g --depth=0을 입력했다.
[root@banana pineapple]# npm list -g --depth=0
/home/grape/.nvm/versions/node/v22.11.0/lib
├── corepack@0.29.4
├── http-server@14.1.1
├── npm@10.9.0
└── pm2@5.4.3
이상하다. 분명 grape계정에서 su를 사용해 root계정으로 전환 후 pineapple폴더로 와서 전역 패키지 확인 명령어를 쳤는데 왜 grape가 나오지?
/home/grape/.nvm/versions/node/v22.11.0/lib
여기서부터 이상함이 느껴졌다. 뭔가 잘못됐다!
다른 동료들의 환경에서도 동일한 명령어를 실행해보았다.
일단 pm2가 실행되던 apple 계정으로 실행을 해보았고,
[root@banana pineapple]# npm list -g --depth=0
/home/apple/.nvm/versions/node/v22.11.0/lib
├── corepack@0.29.4
├── http-server@14.1.1
├── npm@10.9.0
└── pm2@5.4.3
그리고 orange 계정, 아! 생각해보니 npm부터 안됐다는걸 까먹고 이 명령어를 실행했다.
[root@banana pineapple]# npm list -g --depth=0
-bash: npm: 명령어를 찾을 수 없음
음, 일단 상황을 보니 pm2, npm 명령어가 실행되는 grape, apple 계정은 npm으로 전역적으로 설치된 라이브러리의 설치 위치가 /home/[각자의 계정]/... 이다. 왜일까? 나는 root로 들어왔는데?! 같은 root인데 명령어가 차이가 나는 이유가 뭐지?
도와줘요 GPT~!!!
🌞 문제 해결
같은 root인데도 명령어 차이가 나는 이유는 '쉘 환경의 차이' 때문일 가능성이 커!
쉘 환경의 차이?? 이게 무슨 말이지?!
🔍 핵심 원인: 쉘 환경 설정($SHELL, $PATH)의 차이
1. su vs su - 차이
• su root
👉 현재 사용자 환경을 유지한 채 root로 전환
👉 원래 계정(A 또는 B)의 환경변수가 남아 있음
• su - root
👉 root의 로그인 쉘 환경 전체로 전환
👉 root의 .bashrc, .bash_profile, .profile 등을 완전히 불러옴
✅ 이 차이로 인해 PATH에 포함된 명령어가 다르게 로딩될 수 있어.

'뭐라고 저런 차이가 있었어...?'
처음 알았다. 처음 개발 서버에 계정 셋팅해서 사용할 때 su로 root로 변환해서 쓰면 된다!라고 전달 받았어서 늘 su만 써왔고, su -가 있는지도 몰랐다.
그래서 다음 명령어로 su / su - 테스트를 해보았다.
명령어 | 의미 |
whoami | 현재 로그인한 사용자의 사용자 이름을 출력하는 명령어 |
echo $USER | 현재 사용자의 사용자 이름을 출력하는 Linux 명령어 |
echo $PATH | 현재 쉘(shell) 환경에서 PATH 환경 변수의 값을 출력하는 명령어 |
1. su 로 root 전환
[grape@banana ~]$ su
암호:
[root@banana grape]# whoami
root
[root@banana grape]# echo $USER
grape
[root@banana grape]# echo $PATH
/root/.local/bin:/root/bin:/home/grape/.nvm/versions/node/v22.11.0/bin:/home/grape/.local/bin:/home/grape/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/usr/local/mysql/bin
2. su - 로 root 전환
[grape@banana ~]$ su -
암호:
[root@banana ~]# whoami
root
[root@banana ~]# echo $USER
root
[root@banana ~]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
whoami는 동일한데 echo 명령어로 실행한 echo $USER와 echo $PATH는 명확하게 출력값에 차이가 있다.
(whoami와 echo $USER에 대한 설명은 아래 🐣 번외) 왜 whoami와 echo $USER의 출력값이 다를까? 에서 확인!)
⭐ 결론
내가 개발 서버(banana)에 전역(-g)으로 설치했다고 생각한 npm, pm2는 su로 root로 사용자만 바꾸고 환경은 바뀌지 않은 채 설치한 것으로 PATH가 내 디렉토리(grape)로 잡혀, 다른 동료(orange)가 su로 root로 계정을 전환하여 해당 명령어를 사용하려 했을 때는 동료의 계정에서 라이브러리의 PATH(orange)를 찾는데 없어서 '명령어를 찾을 수 없음' 오류가 발생한 것이다!
- su는 사용자만 바꾸고 환경은 그대로
- su -는 사용자 + 환경까지 완전히 바꿈
진짜 개발 서버 내 모든 사용자들이 해당 라이브러리들을 사용할 수 있도록 전역으로 설치하고 싶었다면 나는 su가 아닌 su -로 root로 전환하여 라이브러리들을 전역으로 설치했어야 했던 것..! 새로 들어온 동료 덕에 재밌는 지식을 얻었다.
팀장님께 말씀드려서 개발 서버에 su -로 npm, pm2 등 필요한 라이브러리를 설치해도 되는지 여쭤봐야겠다. 동료들 더 들어올텐데 매번 su로 각자 PATH에 라이브러리들을 설치하는건 굳이 그럴 필요가 있을까 싶으니 말이다. 그래도 해당 개발 서버를 우리 팀만 쓰는게 아니니..! 물어보고 해야지.
🐣 번외) 왜 whoami와 echo $USER의 출력값이 다를까?
su, su - 테스트하다가 발견한 또 다른 궁금증
whoami도 echo $USER도 현재 로그인한 사용자의 사용자 이름을 출력하는 명령어인데 왜 출력된 결과값이 다를까?

✅ whoami vs echo $USER 차이
명령어 | 의미 | 동작 방식 |
whoami | "지금 현재 내 effective user ID는 누구인가?" | 시스템 커널에 직접 물어봄 |
echo $USER | "환경변수(USER)에 뭐가 들어있나?" | 쉘 환경 변수를 읽음 |
🔍 su / su - 상황에 맞춰 본다면?
- su 로 root 전환 시,
- UID는 root로 바뀜 → whoami는 root
- 하지만 환경변수(USER)는 원래 사용자(grape나 orange) 로 남아 있음 → echo $USER는 grape 또는 orange로 나옴
- su - 로 root 전환 시,
- UID는 root → whoami는 root
- 환경변수도 root의 환경으로 초기화 → echo $USER도 root
요약하자면 다음과 같다.
✅ whoami → 커널에 묻는다 (진짜 "누구 권한이냐")
✅ echo $USER → 환경 변수에 있는 값을 출력 (쉘 설정에 따라 다를 수 있음)
✅ su → 사용자만 바꾸고 환경은 그대로
✅ su - → 사용자 + 환경까지 완전히 바꿈
상황 | whoami | echo $USER |
grape계정 → su | root | grape |
grape계정 → su - | root | root |
orange계정 → su | root | orange |
orange계정 → su - | root | root |
결론! Linux 내부 동작을 이해하면서 올바른 명령어를 사용해서 원하고자하는 정보를 알아내자😁