본문으로 건너뛰기

재시작

재시작이 셋입니다 — 어느 것을 쓸지부터​

같은 이름의 restart.sh 가 두 군데 있고, 앱만 다시 띄우는 세 번째가 따로 있습니다. «Tomcat 만 6초» 라는 말은 어느 것에도 해당하지 않습니다.

무엇어디대상걸리는 시간
호스트 재시작plantpulse-edge-docker/bin/restart.sh컨테이너 전체 — 찌꺼기 정리 후 재기동분 단위
스택 재시작$PE_HOME/bin/restart.sh게이트웨이 전체 모듈 — stop.sh + start.sh 를 한 프로세스로~150–210초
앱만 재시작$PE_HOME/bin/restart-app.shTomcat(앱)만. Cassandra · HiveMQ · Node-RED 는 그대로30–90초

대부분의 설정 변경은 앱만 재시작으로 충분합니다. DB · MQTT · Node-RED 까지 다시 올려야 하는 것(예: mqtt.enable 토글)만 스택 재시작입니다.

앱만 재시작 (restart-app.sh)​

화면의 앱 재시작 버튼과 POST /api/v1/system/restart 가 3초 뒤 이것을 부릅니다. 직접 칠 수도 있습니다.

$PE_HOME/bin/restart-app.sh
# 30~90초 후
curl -s http://127.0.0.1/api/v1/edge | jq
밑의 컴포넌트가 죽어 있으면 앱만 재시작해도 살아나지 않습니다

스크립트가 먼저 Cassandra(9042) · Redis(6379) · MQTT(1883) 를 두드려 보고, 죽어 있으면 경고를 찍습니다. 앱만 다시 띄워도 부트스트랩이 어차피 실패하기 때문입니다(알려진 한계).

「재시작해도 안 돌아온다」로 시간을 버리지 않도록 그 경고를 먼저 읽으세요 — 그런 경우엔 스택 재시작이나 그 컴포넌트부터 살려야 합니다.

컨테이너 모드에서 앱만 재시작해도 컨테이너가 내려가지 않는 이유

컨테이너의 PID 1 감시자는 Tomcat 프로세스가 사라지면 컨테이너를 통째로 내립니다. 앱만 재시작하면 Tomcat 이 30~90초 동안 없어지므로 그 감시에 걸립니다.

그래서 restart-app.sh 는 시작할 때 server/logs/.restart-in-progress 마커를 만들어 「의도한 재시작이니 기다려라」 를 알리고, 끝나면 지웁니다. 이 스크립트는 Tomcat 트리에서 떼어져(setsid) 돌기 때문에 Tomcat 을 죽이면서도 자기는 살아남아 마커를 치웁니다.

스택 재시작 ($PE_HOME/bin/restart.sh)​

stop.sh 와 start.sh 를 하나의 프로세스 안에서 이어 돌립니다.

왜 «한 프로세스» 인가 — 2026-07-02 사고

ssh "stop.sh; start.sh" 로 원격 실행하다가 SSH 세션만 끊기면 둘 중 하나가 됩니다 — 정지된 채 버려지거나(start 가 안 돎), 늦게 끝난 반대편이 이미 살아난 스택을 다시 죽이거나.

그래서 이 스크립트는 stop 의 결과와 무관하게 반드시 start 로 진행하고(내려간 채 남는 것이 최악이므로), 결과를 마커 파일에 적어 호출한 쪽이 완료를 확인할 수 있게 합니다.

원격에서는 이렇게 부릅니다.

ssh 박스 "RESTART_RUN_ID=xyz nohup setsid $PE_HOME/bin/restart.sh >/dev/null 2>&1 </dev/null &"
# 그다음 /tmp/pp-restart-xyz.done 을 폴링한다 (내용이 start.sh 의 종료 코드)

기동은 모듈을 차례로 올리며 모듈 하나당 최대 300초의 제한이 걸려 있습니다 (한 모듈이 영영 기다려 부팅 전체가 멈추는 것을 막습니다). 마지막에 최대 180초 동안 살아났는지 훑습니다.


호스트 재시작 (plantpulse-edge-docker/bin/restart.sh)​

게이트웨이를 안전하게 다시 시작합니다. 남아 있는 찌꺼기를 먼저 치우는 것이 systemctl restart 와 다른 점입니다.

sudo /opt/kopens/plantpulse-edge-docker/bin/restart.sh
systemctl restart 만 하면 이름 충돌로 실패할 수 있습니다

옛 컨테이너가 이름을 쥔 채 남아 있거나 좀비 프로세스가 있으면 새 컨테이너가 name already in use 로 뜨지 못합니다. restart.sh 는 그 찌꺼기를 먼저 정리한 뒤 서비스를 올립니다.

언제 재시작하나​

상황재시작이 답인가
설정(app.properties · 환경 변수)을 바꿨다예 — 설정은 기동 때 한 번 읽습니다
드라이버 옵션을 바꿨다아니요 — 연결 단위로 중지 → 시작하면 됩니다
수집이 멈춘 것 같다먼저 진단 및 점검 — 원인을 모른 채 재시작하면 증거가 사라집니다
이미지를 새로 받았다재시작이 아니라 업그레이드

확인​

cd /opt/kopens/plantpulse-edge-docker/bin
./status.sh
./health.sh
./logs.sh -f # 부팅을 따라가며 본다

더 알아보기​