openclaw gateway가 이미 돌아가는데 launchd 상주 Job으로 바꾸자마자 token_missing_config가 반복되거나 대시보드가 열리지 않는 팀은 보통 비밀이 사라졌기 때문이 아니라 SSH 이후에 export한 변수를 감독 프로세스가 전혀 물려받지 못했기 때문입니다. 본문은 KVMNODE 전용 클라우드 Mac mini에 OpenClaw Gateway를 7×24로 두려는 개발자와 작은 팀을 위해 대화 세션과 launchd Job의 환경 차이를 분리하고, token_missing_config 분기, plist EnvironmentVariables와 openclaw.json 단일 출처 조합, launchctl kickstart와 롤백 순서를 정리합니다. 같은 명령을 세 번 풀어 쓰지 않도록 설치·트러블슈팅 점검표, 업그레이드와 원격 접속, 진단 사다리와 교차 링크합니다.2026 셸은 되는데 launchd만 실패하는 이유: 환경 변수 주변 오해 다섯 가지
사람이 로그인한 세션은 profile 체인으로 PATH와 HOME, 그리고 조사 중에 export한 임시 변수를 셸에 붙입니다. launchd가 띄운 Agent나 Daemon은 최소 환경에서 시작하며 ~/.zshrc를 읽어 주지 않습니다. OpenClaw CLI가 Gateway 토큰을 찾을 때는 설정 파일·환경 변수·state 디렉터리를 조합하는데, 그중 하나라도 감독 쪽 경로가 대화 세션과 다르면 로그에 token_missing_config나 이에 가까운 서명이 찍히고 프로세스는 몇 초 안에 종료되거나 헬스가 계속 빨간색입니다. 전용 클라우드 호스트의 이점은 변수 집합을 동결해 티켓에 붙일 수 있다는 점입니다. 노트북 export 이력에 의존하지 않아도 됩니다.
아래 다섯 가지는 출시 전에 지울 오해 목록입니다. 업그레이드 뒤 토큰 키 이름이 바뀐 split brain도 같이 보고 있다면 업그레이드·원격의 이전 절을 병행하고, 어떤 명령을 먼저 실행해야 할지 헷갈리면 진단 사다리로 돌아가십시오. 여기서는 사다리 전체를 다시 쓰지 않고 launchd 전용 갈림만 덧붙입니다.
plist가 터미널 export를 그대로 물려준다고 가정:launchd는 SSH 세션에 잠깐 넣은 변수를 자동으로 가져오지 않습니다.
토큰을 셸 프로필에만 둠:cron과 GUI가 섞인 경우에는 가끔 되지만 순수 Agent에는 안정적으로 실패합니다.
root 도메인과 로그인 사용자 도메인 plist를 섞음:openclaw.json을 소유한 Unix 사용자와 plist UserName이 다르면 경로가 조용히 갈라집니다.
업그레이드 후 binary 경로는 바뀌었는데 ProgramArguments는 그대로:토큰 문제처럼 보이지만 실제로는 옛 빌드를 실행합니다.
먼 지역 M4 Pro 고사양 노드에서 실패를 연산 부족으로만 돌림:토큰 읽기 실패와 CPU 차트는 단조로운 상관이 거의 없습니다.
경계를 정한 뒤 리전을 옮길지는 24시간 안정 운영의 전원·맥락으로 돌아가고, 본문은 감독 프로세스가 설정을 읽는 문제만 다룹니다.
SSH ControlMaster 같은 다중화는 잡음을 키웁니다. 사람은 포워딩된 포트로 대시보드를 열고 launchd 데몬은 다른 loopback 뷰나 다른 사용자에 묶여 있어 사람에게는 초록, 모니터에는 빨강이 됩니다. 리스너 주소·bind·토큰 검증을 한 Runbook에 적고 임시 포워드와 생산 plist 토폴로지를 티켓에 구분해 적으면 야간 오탐이 줄어듭니다.
같은 머신에 자체 CI나 무거운 Archive가 돌면 CPU 스파이크와 로그 롤이 같은 창에서 중요한 줄을 덮을 수 있습니다. 토큰과 무관하지만 같은 시간대에 겹칩니다. 인시던트 창에는 로그 파티션을 나누거나 관계없는 컴포넌트 로그 레벨을 낮추는 편이 저렴한 운영 부가입니다.
재무가 코어 SKU를 더 살지 물을 때도 먼저 감독 env 차이와 plist 경로 스탬프를 티켓에 붙이면 사건이 연산 굶주림이 아니라 감독 환경 표류였음을 보여 줄 수 있습니다. 잘못된 실리콘 구매를 막는 습관입니다.
표: plist 환경 변수 vs openclaw.json만, split brain과 어떻게 나눌까
단일 출처란 사후 분석에서 누가 어떤 경로에서 어떤 키를 읽었는지 한 문장으로 말할 수 있게 만드는 것입니다. 실무 타협은 비밀은 권한이 있는 openclaw.json 안에만 두고 plist에는 state 루트나 프로필 이름 같은 비밀이 아닌 위치 정보만 넣어 긴 토큰을 여러 plist 조각에 복제하지 않는 쪽입니다. CLI와 데몬이 서로 다른 파일 사본을 읽으면 로그가 split brain처럼 보이므로 재설치 전에 openclaw doctor 경로 스탬프를 맞춥니다.
| 전략 | 맞는 경우 | 리스크 | 운영 메모 |
|---|---|---|---|
| openclaw.json만 | 단일 사용자 전용 클라우드 노드 | chmod가 느슨하면 유출 | 전용 Unix 사용자와 짝 |
| plist EnvironmentVariables로 경로 | state 루트를 고정해야 함 | 철자 하나로 즉시 실패 | systemd 스타일 명시 주입과 같음 |
| 둘 다에 평문 토큰 | 짧은 조사 | 로테이션 때 한쪽 누락 | 상시 상태로 금지 |
| 로그 서명 | 가능성 | 다음 동작 |
|---|---|---|
| token_missing_config가 launchd에서만 | 감독 환경에 키나 경로 없음 | launchctl print로 plist와 UserName 대조 |
| CLI와 데몬 버전 스탬프 불일치 | split brain | 사다리 문서의 PATH 수정 절 |
| 대화·무인 모두 실패 | 설정 손상 또는 키 이름 변경 | 업그레이드 글의 토큰 이전 체크리스트 |
launchd 사고의 제1원칙: 감독 환경을 먼저 인쇄하고 그다음 토큰 값을 논의한다.
무인 프로브와 짝을 이룰 때는 프로브 셸의 키를 plist 키와 맞춰야 자정 스크립트는 초록인데 launchd만 빨강인 소음이 줄어듭니다.
gateway.mode remote와 로컬 상주를 같이 쓰면 클라이언트 환경과 서버 plist 환경을 두 번째 표로 그리십시오. remote 클라이언트가 읽는 토큰 경로는 클라우드 데몬과 다릅니다. 두 로그를 한 티켓에 붙이면서 역할을 표기하지 않으면 클라이언트 결손을 서버 결손으로 잘못 넣습니다.
반기 감사에서 외주 종료 후 home이 회수된데도 plist가 옛 홈을 가리키는지 샘플링하십시오. 빌드는 깨지지 않아도 조용한 재부팅 뒤 토큰 루프가 돌아올 수 있습니다.
plist EnvironmentVariables와 launchctl: 최소 재현과 XML 뼈대
운영 plist를 건드리기 전에 일회용 LaunchAgent로 /bin/sh -lc 'env | sort'만 돌려 실제 감독 키 집합을 받고 나서 진짜 openclaw gateway 인수로 바꿉니다. 렌털 노드에서 자주 빠지는 것은 Homebrew나 npm 전역이 빠진 PATH로 doctor는 통과하지만 데몬은 실패하는 경우입니다. 티켓에는 노트북에서 물려받은 수십 개 접두사 대신 최소 PATH를 동결해 적습니다.
<key>EnvironmentVariables</key> <dict> <key>PATH</key> <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string> <key>OPENCLAW_STATE_DIR</key> <string>/Users/ocagent/.openclaw</string> </dict>
안내:실제 비밀은 지원되는 도구로 openclaw.json의 gateway.auth 트리에 두고 위 스니펫은 위치 키만 보여 줍니다. 저장소 plist에 평문을 붙이지 마십시오.
수정 뒤에는 launchctl bootout 후 bootstrap 또는 도메인에 맞는 kickstart -k로 오래된 프로세스가 오래된 env 캐시를 쥐고 남지 않게 합니다. Gateway가 옛 토큰을 읽으면 같은 사용자 도메인에 둘째 plist가 경쟁 로드되는 경우가 많으니 launchctl list | grep -i openclaw로 중복을 제거합니다.
nvm이나 fnm으로 Node를 관리하면 plist에 셸에서 which로 잡힌 것이 아니라 절대 경로의 node와 openclaw를 박아야 합니다. 이미지 소버전이 올랐는데 plist가 옛 접두사를 가리키면 doctor 통과 데몬 실패 괴리가 납니다.
Gateway 전용 시스템 사용자를 만들었다면 WorkingDirectory와 암시적 HOME을 그 사용자 home에 맞추어 상대 경로가 빈 임시 폴더로 떨어졌다가 토큰 결손 서명으로 튕기는 일을 막습니다.
여섯 단계: 셸 데모에서 감사 가능한 launchd 상주로
재현 동결:성공한 대화 세션과 실패한 감독 각각의 env | sort와 openclaw gateway status 텍스트를 남깁니다.
launchctl print 대조:Label, ProgramArguments, UserName, WorkingDirectory를 기대와 맞춥니다.
단일 출처 통일:지원 도구로 openclaw.json을 다시 쓰고 plist 중복 비밀을 지웁니다.
EnvironmentVariables 채움:최소 PATH와 state 루트, 필요하면 명시적 node 바이너리 키.
kickstart 후 로그 앞 200줄:진단 사다리 doctor 절과 교차 검증합니다.
Runbook과 변경 행:리전과 근거리 입문 대 먼 거리 M4 Pro를 적고 주문 필드는 주문 페이지에 맞춥니다.
인용 가능한 문구: plist 도메인, 로그 짝, 먼 지역 M4 Pro 오탐 예산
LaunchAgent 대 daemon 도메인:파일 시스템에서 openclaw.json 소유자가 plist 정체와 같아야 읽기와 쓰기가 갈라지지 않습니다.
토큰 결손과 즉시 종료가 같은 프레임:상위 API 할당량보다 환경을 먼저 의심합니다.
먼 지역 M4 Pro:프로브 동시성이 조금 올라가도 토큰 경로 오류를 가리지 않게 스크립트에 임계값을 박습니다.
주의:토큰 평문을 채팅이나 공유 노트에 붙이는 것은 공급망 위험입니다. 금고나 제한된 파일을 쓰십시오.
토큰을 셸 이력이나 임시 export에만 두면 시연은 되지만 7×24 사후 분석에서는 재현이 어렵습니다. 반대로 전용 Apple Silicon 클라우드 노드에서 plist와 보호된 openclaw.json 단일 출처를 맞추면 Gateway를 감사 가능한 생산 구성 요소로 만들 수 있습니다. 싱가포르·미 동부 등 리전에 안정적인 대시보드와 프로브 경로가 필요한 팀에게 KVMNODE Mac mini 클라우드 렌탈이 보통 더 잘 맞습니다: 베어메탈 격리, 투명한 지역, 구성 단계, 탄력 렌트, 감독 환경 집합을 재무 필드에 맞출 수 있습니다. 가격과 연결은 대여 가격과 고객 센터를 이어서 보십시오.
가동 후에는 마지막 성공 kickstart 시각, plist Label, OpenClaw 버전 스탬프 세 필드를 CMDB나 비용 태그 옆에 자동으로 붙이면 재무가 호스트 이름만 보고 Gateway 책임을 추측하지 않아도 됩니다.
한 대의 클라우드 Mac에 실험용 Gateway를 여러 Label로 띄울 계획이면 인스턴스마다 state 디렉터리와 포트 구간을 나누고 방화벽에서 명시적으로 허용해 포트 충돌을 토큰 결함으로 읽는 일을 줄입니다.