λ³Έ κ°€μ΄λ“œλŠ” μš°λΆ„νˆ¬ μ„œλ²„μ˜ CPU, λ©”λͺ¨λ¦¬, λ””μŠ€ν¬ μ‚¬μš©λ₯ μ„ μ‹€μ‹œκ°„μœΌλ‘œ μΈ‘μ •ν•˜μ—¬ 원격 MariaDB(qst-s.iptime.org)에 μžλ™μœΌλ‘œ μ—…λ°μ΄νŠΈν•˜λŠ” μ—μ΄μ „νŠΈ μ„€μ • 과정을 λ‹΄κ³  μžˆμŠ΅λ‹ˆλ‹€.

1. ν•„μˆ˜ 라이브러리 μ„€μΉ˜

νŒŒμ΄μ¬μ—μ„œ λ¦¬μ†ŒμŠ€ μΈ‘μ • 및 DB 연결을 μœ„ν•΄ ν•„μš”ν•œ νŒ¨ν‚€μ§€λ₯Ό μ‹œμŠ€ν…œ 전체 ν™˜κ²½μ— μ„€μΉ˜ν•©λ‹ˆλ‹€.

# νŒ¨ν‚€μ§€ λͺ©λ‘ μ—…λ°μ΄νŠΈ
sudo apt update

# λ¦¬μ†ŒμŠ€ μΈ‘μ •(psutil) 및 MariaDB μ—°κ²° 라이브러리 μ„€μΉ˜
sudo apt install python3-psutil python3-mysql.connector -y

2. λͺ¨λ‹ˆν„°λ§ μ—μ΄μ „νŠΈ μ½”λ“œ μž‘μ„±

/opt κ²½λ‘œμ— μ‹€ν–‰ νŒŒμΌμ„ μƒμ„±ν•˜κ³ , μ΅œμ ν™”λœ 디버깅 μ½”λ“œλ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€.

import time
import psutil
import mysql.connector
import sys
from datetime import datetime

# ==========================================
# [μ„€μ •] MariaDB 접속 정보
# ==========================================
DB_CONFIG = {
    'host': 'qst-s.iptime.org',
    'port': 33063,
    'user': 'qsentech',
    'password': 'qsentech!1233',
    'database': 'paradise'
}

def get_connection():
    return mysql.connector.connect(**DB_CONFIG)

def main():
    print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] μ—μ΄μ „νŠΈ μž‘λ™ μ‹œμž‘...")
    
    while True:
        conn = None
        try:
            # 1. 데이터 μˆ˜μ§‘ (CPUλŠ” 1μ΄ˆκ°„μ˜ 평균값 μΈ‘μ •)
            cpu = psutil.cpu_percent(interval=1)
            mem = psutil.virtual_memory().percent
            disk = psutil.disk_usage('/').percent

            # 2. DB μ—°κ²° 및 쿼리 μ‹€ν–‰
            conn = get_connection()
            cursor = conn.cursor()

            # idxNo 1: CPU, 2: MEMORY, 3: DISK μ—…λ°μ΄νŠΈ
            updates = [
                ("UPDATE tbl_resource_info SET resValue = %s WHERE idxNo = 1", (str(cpu),)),
                ("UPDATE tbl_resource_info SET resValue = %s WHERE idxNo = 2", (str(mem),)),
                ("UPDATE tbl_resource_info SET resValue = %s WHERE idxNo = 3", (str(disk),))
            ]

            total_affected = 0
            for sql, val in updates:
                cursor.execute(sql, val)
                total_affected += cursor.rowcount

            conn.commit()

            # 3. 둜그 좜λ ₯ (PYTHONUNBUFFERED μ„€μ • μ‹œ μ‹€μ‹œκ°„ 확인 κ°€λŠ₯)
            print(f"[{datetime.now().strftime('%H:%M:%S')}] C:{cpu}% | M:{mem}% | D:{disk}% | Rows:{total_affected}")

        except Exception as e:
            print(f"Error: {e}", file=sys.stderr)
        
        finally:
            if conn and conn.is_connected():
                cursor.close()
                conn.close()

        # 4. 3초 간격 λŒ€κΈ°
        time.sleep(3)

if __name__ == "__main__":
    main()

3. μ‹œμŠ€ν…œ μ„œλΉ„μŠ€(Systemd) 등둝

μ„œλ²„κ°€ μž¬λΆ€νŒ…λ˜μ–΄λ„ μ—μ΄μ „νŠΈκ°€ μžλ™μœΌλ‘œ μ‹€ν–‰λ˜λ„λ‘ λ°±κ·ΈλΌμš΄λ“œ μ„œλΉ„μŠ€λ‘œ λ“±λ‘ν•©λ‹ˆλ‹€.

[Unit]
Description=Paradise Resource Monitoring Agent
After=network.target

[Service]
ExecStart=/usr/bin/python3 /opt/resource_agent.py
Restart=always
RestartSec=5
User=root
# 둜그 μ‹€μ‹œκ°„ 확인을 μœ„ν•œ ν™˜κ²½λ³€μˆ˜
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target

4. μ„œλΉ„μŠ€ ν™œμ„±ν™” 및 관리 λͺ…λ Ήμ–΄

섀정을 λ³€κ²½ν•  λ•Œλ§ˆλ‹€ μ•„λž˜ λͺ…령어듀을 μ‚¬μš©ν•˜μ—¬ μ μš©ν•©λ‹ˆλ‹€.

# 1. μ‹œμŠ€ν…œ μ„€μ • μƒˆλ‘œκ³ μΉ¨ (파일 μˆ˜μ • ν›„ ν•„μˆ˜)
sudo systemctl daemon-reload

# 2. μ—μ΄μ „νŠΈ μ„œλΉ„μŠ€ μ‹œμž‘ 및 μžλ™μ‹€ν–‰ 등둝
sudo systemctl enable --now resource-agent

# 3. μ„œλΉ„μŠ€ μƒνƒœ 확인 (μ΄ˆλ‘μƒ‰ active 확인)
sudo systemctl status resource-agent

# 4. μ‹€μ‹œκ°„ 둜그 λͺ¨λ‹ˆν„°λ§ (DB μ—…λ°μ΄νŠΈ ν™•μΈμš©)
sudo journalctl -u resource-agent -f

5. μ΅œμ’… 확인 방법

  1. μš°λΆ„νˆ¬ 터미널: sudo journalctl -u resource-agent -f μ‹€ν–‰ μ‹œ μ—…λ°μ΄νŠΈλœ 쀄 수: 3이 λœ¨λŠ”μ§€ ν™•μΈν•©λ‹ˆλ‹€.