패키지로 설치하지 않고 tarball 바이너리를 풀어 쓰는 도구(Prometheus, node_exporter, Alertmanager, Loki 등)는 서비스 파일이 딸려 오지 않는다. 기동·정지 셸 스크립트를 직접 짜는 대신 유닛 파일을 만들어 systemd 에 맡기면 부팅 자동 시작, 비정상 종료 시 재기동, 로그 수집이 한 번에 해결된다.
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=node_exporter
Group=node_exporter
ExecStart=/usr/local/bin/node_exporter
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
/etc/systemd/system/node_exporter.service 에 두고 등록한다.
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
systemctl status node_exporter
After=network-online.target 은 순서만 정한다. 네트워크가 실제로 올라오기를 기다리게 하려면 Wants=network-online.target 을 같이 둬야 한다. 둘 중 하나만 쓰면 원하는 동작이 나오지 않는다.
Type=simple 은 ExecStart 로 띄운 프로세스가 곧 서비스 본체라는 뜻이다. 프로그램이 스스로 백그라운드로 내려가는(daemonize) 형태면 Type=forking 과 PIDFile= 을 쓴다. 대부분의 Go 로 만든 exporter 류는 포그라운드로 도므로 simple 이 맞고, 실행 옵션에 --daemonize 같은 것이 있다면 끄는 쪽으로 맞춘다.
WantedBy=multi-user.target 이 일반적인 서버 서비스의 자리다. default.target 은 GUI 가 깔린 장비에서 graphical.target 을 가리킬 수 있어 의도와 달라진다.
Restart=on-failure 는 0 이 아닌 종료 코드나 시그널로 죽었을 때만 되살린다. Restart=always 는 정상 종료까지 되살리므로 수동 정지가 안 되는 것처럼 보일 수 있다.
로그인할 필요가 없는 서비스 계정을 쓴다.
sudo useradd --system --no-create-home --shell /sbin/nologin node_exporter
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
sudo chmod 755 /usr/local/bin/node_exporter
Prometheus 처럼 인자가 많으면 역슬래시로 줄을 나눈다.
[Unit]
Description=Prometheus
After=network-online.target
Wants=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/opt/prometheus/conf/prometheus.yaml \
--storage.tsdb.path=/opt/prometheus/tsdb \
--web.enable-lifecycle
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
Prometheus 는 --web.enable-lifecycle 을 켜야 재시작 없이 설정을 다시 읽을 수 있다.
curl -X POST http://localhost:9090/-/reload
옵션을 유닛 파일에 직접 박지 않고 별도 파일로 뺄 수 있다. 값만 바꿀 때 daemon-reload 가 필요 없고, 설정 파일 권한을 따로 줄 수 있다.
EnvironmentFile=/etc/sysconfig/node_exporter
ExecStart=/usr/local/bin/node_exporter $OPTIONS
# /etc/sysconfig/node_exporter
OPTIONS="--web.listen-address=:9100 --collector.systemd"
journalctl -u node_exporter -n 100 --no-pager
journalctl -u node_exporter -f
journalctl -u node_exporter --since "2026-09-20 09:00"
표준 출력은 저널로 들어간다. 파일로 남기고 싶으면 StandardOutput=append:/var/log/node_exporter.log 를 쓴다. 다만 로그 회전은 직접 붙여야 한다.