루팅을 마치고 Termux + proot-distro로 서버 환경까지 만들었는데, 정작 그 위에서 tmux 세션들이 가만히 있다가 조용히 죽어있는 일이 반복됐습니다. 카카오톡 봇이 이유 없이 응답을 멈추길래 확인해보면, Termux 프로세스 자체가 안드로이드 시스템에 의해 강제 종료돼 있었습니다. 이번 글은 그 문제를 해결하기까지의 과정입니다.
증상: 화면을 안 보고 있으면 죽는다
패턴은 명확했습니다. 화면을 켜서 Termux를 보고 있을 때는 멀쩡하다가, 다른 앱을 쓰거나 화면을 꺼두고 시간이 좀 지나면 tmux 세션 안의 프로세스들이 통째로 죽어있는 경우가 잦았습니다. 전형적인 안드로이드의 백그라운드 프로세스 관리 — 특히 삼성 기기의 배터리 최적화가 공격적이기로 유명합니다 — 에 의해 Termux가 “안 쓰는 앱"으로 분류되어 정리되는 것으로 보였습니다.

시도했지만 부족했던 방법들
먼저 Termux 생태계 안에서 제공하는 표준적인 방법들을 순서대로 시도했습니다.
- Termux:Boot: 기기 재부팅 시 자동으로 스크립트를 실행해주는 애드온. 재부팅 이후 복구에는 도움이 되지만, 애초에 중간에 죽는 것 자체를 막아주지는 않습니다.
- Termux:API를 활용한 포그라운드 알림 유지: Termux가 백그라운드에서도 “지금 실행 중"이라는 알림을 계속 띄워서 시스템에 존재를 알리는 방식.
- termux-wake-lock: 절전 모드에서도 CPU가 완전히 잠들지 않도록 wake lock을 거는 명령.
- 시스템 설정에서 Termux 앱의 배터리 최적화를 수동으로 예외 처리
이 방법들을 다 적용해도 하루에도 몇번씩 예측 불가능한 시점에 Termux가 죽어있는 일이 반복됐습니다. 하나하나는 도움이 됐을 수 있지만, 완전히 막지는 못했습니다.
해결: MacroDroid로 외부 워치독 만들기
결국 Termux 생태계 안에서 해결하려는 시도를 접고, 완전히 다른 앱인 MacroDroid를 끌어왔습니다. MacroDroid는 조건(트리거)과 동작(액션)을 조합해 자동화 매크로를 만드는 범용 자동화 앱입니다. 여기서는 주기적으로 Termux 관련 프로세스나 세션 상태를 확인하고, 죽어있으면 다시 실행시키는 매크로를 구성해서 “외부 워치독” 역할을 하게 만들었습니다.
핵심 아이디어는 간단합니다 — Termux 스스로가 자기 자신을 안 죽게 만드는 데는 한계가 있으니, 안드로이드의 프로세스 관리 정책 바깥에서 별도로 동작하는 감시자를 하나 더 두는 것입니다. MacroDroid가 이 역할을 맡은 뒤로는 Termux가 죽더라도 오래 방치되지 않고 다시 살아나기 시작했고, 봇이 몇 시간씩 응답을 멈추는 일을 방지할 수 있었습니다.
돌아보며
이 문제는 결국 “안드로이드는 백그라운드 앱을 살려두는 것을 기본적으로 싫어하는 운영체제"라는 사실을 정면으로 받아들이고, 그 정책과 싸우기보다는 우회하는 쪽을 택해서 풀렸습니다. Termux 자체 기능만으로 안 된다면, 외부의 범용 자동화 도구를 조합하는 것도 실용적인 선택지라는 걸 배운 경험이었습니다.

🤖 이 포스팅은 AI의 도움을 받아 작성되었습니다.


💬 댓글