systemd 서비스 상태 체크 코드
View 351 | 작성일2024.11.11 17:24
관련링크
본문
gpt 에게 systemd 서비스 상태 체크하는 코드를 작성하게 시켜봤습니다.
- 파이썬 코드
import sys, asyncio
from prometheus_client import Gauge, start_http_server
import subprocess
# Prometheus Gauge 정의
service_status = Gauge('systemd_service_status', 'Status of a systemd service', ['service'])
async def get_service_status(service_name):
"""특정 서비스의 상태를 확인하여 1 (활성) 또는 0 (비활성) 반환."""
try:
output = await asyncio.create_subprocess_exec(
'systemctl', 'is-active', service_name,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
stdout, _ = await output.communicate()
return 1 if stdout.decode().strip() == "active" else 0
except subprocess.CalledProcessError:
return 0 # 서비스가 비활성화되어 있는 경우
async def monitor_service(service_name, interval):
"""지정된 서비스 상태를 주기적으로 확인하고 메트릭 업데이트."""
while True:
status = await get_service_status(service_name)
service_status.labels(service=service_name).set(status)
await asyncio.sleep(interval)
async def main(service_name, service_port, interval=60):
# Prometheus 서버 시작
start_http_server(service_port, addr="0.0.0.0")
print(f"Prometheus metrics available at http://0.0.0.0:{service_port}/metrics")
# 서비스 상태 모니터링 시작
await monitor_service(service_name, interval)
if __name__ == '__main__':
if len(sys.argv) < 3:
print("Usage: python ")
sys.exit(1)
service_name = sys.argv[1]
service_port = int(sys.argv[2])
asyncio.run(main(service_name, service_port))
- grafana 에서 promql 은 다음과 같이 하면..
systemd_service_status{service="nginx", instance="192.168.100.160:9200"} == 1
제법 잘 동작합니다.