plist의 인자를 고치고 launchctl kickstart -k로 재시작했는데, 프로세스는 새로 떴고 설정은 옛날 그대로입니다.
kickstart는 plist를 다시 읽지 않습니다. 등록돼 있는 그대로 프로세스만 다시 띄웁니다.
고친 plist를 반영하려면 잡을 내렸다가 다시 올립니다.
launchctl bootout gui/$(id -u)/com.marketriskradar.mlxserver
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.marketriskradar.mlxserver.plist
ps -p $(pgrep -f mlx_lm.server) -o command= # 인자가 바뀌었는지 눈으로 확인
세 번째 줄이 답을 확인하는 줄입니다. 그 한 줄을 안 봐서 저는 한밤을 썼습니다.
환경
- Mac mini, Apple M4 Pro, 통합 메모리 64GB, macOS 26.5
mlx_lm.server0.31.1을 사용자 LaunchAgent로 운영합니다. plist 전체는 맥미니 로컬 LLM 상시 운영 설정 글의 부록 1에 있습니다- 여기서 고친 인자는 캐시 상한 두 줄,
--prompt-cache-size 2와--prompt-cache-bytes 4294967296입니다
kickstart -k는 무엇을 다시 띄우나?
8월 19일 0시 4분입니다.
캐시 상한 두 줄을 plist에 넣고 launchctl kickstart -k gui/$(id -u)/com.marketriskradar.mlxserver를 쳤습니다.
프로세스는 새 PID로 떴습니다. 3분 뒤 로그가 이랬습니다.
2026-08-19 00:06:57 - INFO - KV Caches: 6 seq, 8.13 GB, latest user cache 0 tokens
상한이 2개인데 6개입니다.
인자를 봤습니다.
$ ps -p $(pgrep -f mlx_lm.server) -o command=
/opt/homebrew/bin/mlx_lm.server --model /Users/you/models/exaone-3.5-32b-4bit --port 8080 --trust-remote-code
새 두 줄이 없습니다.
파일에는 있는데 프로세스에는 없는 두 줄.
man page는 kickstart를 “설정된 실행 조건과 무관하게 즉시 실행”으로, -k를 “돌고 있으면 죽인 뒤 재시작”으로만 적습니다. plist 재적재는 어디에도 없습니다.
실측이 그 문장을 확인해 줬습니다. kickstart는 프로세스를 다시 띄우는 명령이고, 등록을 바꾸는 명령이 아닙니다.
등록은 무엇으로 바꾸나?
파일을 고쳤다고 launchd 안의 등록이 바뀌지는 않습니다.
등록을 내리는 명령이 bootout, 파일을 읽어 다시 올리는 명령이 bootstrap입니다.
launchctl bootout gui/$(id -u)/com.marketriskradar.mlxserver
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.marketriskradar.mlxserver.plist
0시 12분에 이렇게 다시 올렸습니다.
$ ps -p $(pgrep -f mlx_lm.server) -o command=
/opt/homebrew/bin/mlx_lm.server --model /Users/you/models/exaone-3.5-32b-4bit --port 8080 --trust-remote-code --prompt-cache-size 2 --prompt-cache-bytes 4294967296
이번에는 두 줄.
그 뒤 로그의 캐시는 한 번도 2 seq, 3.23 GB를 넘지 않았습니다. 상한을 건 8월 20일부터 9월 19일까지 26일 동안 5,231건을 그 설정으로 처리했습니다.
load와 unload로도 같은 일이 됩니다. man page가 둘을 레거시로 묶어 두고 새 이름을 권해서 저는 새 이름을 씁니다.
재시작 한 번의 값은 얼마인가?
이 서버는 32B 모델을 올립니다.
8월 20일 실측으로 프로세스 시작이 08시 10분 51초, Starting httpd가 08시 16분 48초입니다. 콜드 로드 5분 57초이고, 그동안 8080 포트는 연결을 거부합니다.
kickstart로 헛돈 8월 19일 밤은 그 값을 두 번 냈습니다.
합쳐 12분.
그래서 지금은 두 가지를 지킵니다.
- 재시작은 배치가 도는 시간을 피해서 합니다
- 올린 직후
ps -o command=로 인자를 보고 끝냅니다. 로그가 3분 뒤에 말해 주기를 기다리지 않습니다
남는 것
kickstart는 재시작이지 재적재가 아닙니다. 파일을 고쳤으면 bootout 뒤 bootstrap입니다. man page에 재적재가 없다는 것이 근거이고, 인자가 옛것 그대로였다는 것이 실측입니다.
반영됐는지는 프로세스한테 묻습니다. ps -o command= 한 줄이면 됩니다. 로그를 기다리면 3분, 로그를 안 보면 며칠입니다.
재시작에는 값이 있습니다. 32B는 6분입니다. 잘못 누른 재시작은 그 값을 두 번 냅니다.
이 글의 로그와 시각은 다음 명령으로 직접 확인한 값입니다. 처리 건수 5,231건과 26일은 비공개 DB의 llm_run 테이블에서 센 값이라 재현되지 않습니다.
# 지금 프로세스가 어떤 인자로 떠 있는가
ps -p $(pgrep -f mlx_lm.server) -o command=
# 서비스 상태와 마지막 종료 코드
launchctl print gui/$(id -u)/com.marketriskradar.mlxserver | grep -E 'state|pid|runs'
# 로그에 찍힌 캐시 상한
grep -o 'KV Caches: [0-9]* seq, [0-9.]* GB' ~/logs/mlx-server.error.log | sort -t' ' -k5 -n | tail -1
# 콜드 로드 시간, 프로세스 시작 시각과 포트 오픈 시각의 차이
ps -p $(pgrep -f mlx_lm.server) -o lstart=
grep 'Starting httpd' ~/logs/mlx-server.error.log | tail -1
자주 묻는 질문
Q. launchctl kickstart는 무엇을 하는 명령인가요?
등록된 서비스를 지금 바로 실행합니다. 실행 조건이 안 됐어도, 이미 돌고 있어도 -k를 주면 죽이고 다시 띄웁니다. 등록 정보를 바꾸거나 plist를 다시 읽는 일은 하지 않습니다.
Q. sudo launchctl kickstart는 언제 쓰나요?
/Library/LaunchDaemons에 둔 시스템 데몬을 다룰 때입니다. 대상이 system/라벨이라 root 권한이 필요합니다. 이 글의 서버처럼 사용자 로그인에 딸린 LaunchAgent는 대상이 gui/$(id -u)/라벨이고 sudo 없이 칩니다.
참고 자료
- launchctl man page 는
kickstart와-k의 설명에 plist 재적재가 없다는 것, 그리고load와unload가 레거시로 묶여 있다는 것의 근거입니다. - 맥미니 로컬 LLM 상시 운영 설정 은 이 서버의 plist 전체와 캐시 상한 두 줄이 왜 필요했는지가 있는 허브 글입니다.
이 사이트의 수치는 주 1회 DB와 다시 대조하고, 판단이 바뀌면 지우지 않고 글 안에 덧붙입니다. 갱신은 RSS로 받을 수 있습니다.