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를 보낸다. 봇이 켜져 있는 한 포지션 관리 책임은 봇에 있다. 꺼질 때도 마찬가지다.

댓글()
개인정보처리방침