launchctl stop 했는데 포지션이 안 닫힌다
코인 훈수2026. 4. 20. 23:38
봇을 잠깐 멈추려고 launchctl stop com.nadogrid를 쳤다. 오더는 취소됐다. 그런데 포지션이 그대로 남아있었다. ETH 롱이 열린 채로 봇만 꺼진 상태. 이러면 봇이 없으니까 스탑로스도 없다. 그냥 물리는 거다.
원인
봇에는 종료 핸들러가 있었다.
def graceful_shutdown(signum, frame):
global running
print("\n[BOT] Shutting down gracefully...")
running = False
signal.signal(signal.SIGTERM, graceful_shutdown)
signal.signal(signal.SIGINT, graceful_shutdown)
launchctl stop은 SIGTERM을 보낸다. 핸들러가 받아서 running = False로 루프를 종료한다. 문제는 여기서 끝난다는 거다. 오더 취소, 포지션 종료 없이 그냥 꺼진다. 봇에는 이미 handle_kill()이라는 함수가 있었다. 오더 취소, 포지션 시장가 종료, 실패 시 5회 재시도까지 다 갖춰진 함수다. 근데 종료 핸들러가 그걸 안 부르고 있었다.
수정
한 줄 바꿨다.
# 수정 전
def graceful_shutdown(signum, frame):
global running
print("\n[BOT] Shutting down gracefully...")
running = False
# 수정 후
def graceful_shutdown(signum, frame):
print("\n[BOT] Shutting down gracefully...")
handle_kill(close_position=True)
handle_kill(close_position=True)가 알아서 오더 취소 → 포지션 종료 → 텔레그램 알림까지 처리한다.
교훈
종료 핸들러가 있다고 해서 안전하게 종료되는 게 아니다. 핸들러가 뭘 하는지가 중요하다. launchctl stop, Ctrl+C, 서버 재부팅 — 모두 SIGTERM이나 SIGINT를 보낸다. 봇이 켜져 있는 한 포지션 관리 책임은 봇에 있다. 꺼질 때도 마찬가지다.
'코인 훈수' 카테고리의 다른 글
| Telegram 409, 봇이 두 개인 줄 몰랐다 (0) | 2026.04.22 |
|---|---|
| Ink 30계정 파밍 세팅했다 (0) | 2026.04.21 |
| 업비트봇 끄기로 했다 (0) | 2026.04.19 |
| ETH 봇 3번 손절 맞고 파라미터 바꿨다 (0) | 2026.04.18 |
| 봇 수익이 생각보다 적다. 근데 계속하는 이유 (0) | 2026.04.18 |
댓글()







