power / knowledge

NUT 서비스 자동 시작과 LISTEN 주소 때문에 겪은 문제

paul 2025.10.07 240words (1m)

UPS 감시는 부팅할 때 자동으로 올라와야 의미가 있다. 정전으로 한 번 꺼졌다 켜졌는데 NUT이 안 떠 있으면 다음 정전에 그대로 당한다.

무엇을 enable할지 찾기

console
$ systemctl list-units --type=service | grep -E 'nut|ups'
  nut-driver@apc.service    loaded active running Network UPS Tools - device driver for NUT device 'apc'
  nut-monitor.service       loaded active running Network UPS Tools - power device monitor and shutdown controller
  nut-server.service        loaded active running Network UPS Tools - power devices information server

드라이버 서비스는 nut-driver@ 뒤에 UPS 이름이 붙는 형태다. ups.conf 에서 [apc] 라고 지었으니 nut-driver@apc 가 된다.

console
$ systemctl enable nut-driver@apc.service
$ systemctl enable nut-server
$ systemctl enable nut-monitor

감시만 하는 쪽은 하나면 된다.

console
$ systemctl enable nut-client

순서가 있다. 드라이버가 먼저 떠야 upsd 가 붙을 UPS가 생기고, upsd 가 떠야 upsmon 이 물어볼 상대가 생긴다.

LISTEN을 IP로 제한했더니 부팅 때 실패했다

upsd.conf 에서 어느 주소로 들을지 정한다. 문서를 보면 0.0.0.0 은 비추천이고 필요한 주소만 여는 걸 권한다.

bash
# 이렇게 하고 싶었다
LISTEN 127.0.0.1 3493
LISTEN <서버의 내부 IP> 3493

그런데 이렇게 두니 부팅할 때 nut-server 가 뜨지 않았다. 손으로 다시 시작하면 잘 된다.

원인은 순서였다. upsd 가 시작하는 시점에 아직 DHCP로 IP를 받기 전이라 bind할 주소가 없다. 없는 주소에 LISTEN하라고 하니 그대로 죽는다. 수동으로 다시 시작할 때는 이미 IP가 있으니 문제가 없었다.

bash
LISTEN 0.0.0.0 3493

결국 0.0.0.0 으로 뒀다. 부팅 시점에 IP가 무엇이든 상관없이 뜬다.

주소로 막는 대신 방화벽에서 3493 포트를 내부망으로만 열어두는 편이 낫다고 본다. systemd 유닛에 네트워크 대기 조건을 거는 방법도 있겠지만, 이쪽이 단순하다.