Server Monitor Scripts

Server Monitoring Scripts

最近在帮组里维护服务器,写了几个简单的脚本,很久没更新了,顺便记录一下。服务器监控最重要的就是CPU, RAMDiskRAM达到100%的时候会导致服务器死机,重启,等一系列问题。所以为了防止服务器出现这种问题,我们需要做的就是在RAM使用率达到100%之前就给KILL或者设置一个阈值,当使用率达到阈值的时候发邮件通知正在跑程序的用户来及时的关闭正在执行的程序。为了安全问题,我这边没有设置自动KILL的方式,因为KILL别人启动的线程需要root权限。所以为了安全起见,还是通知用户自己去关闭的比较好。

Psutil

psutil是一个Python模块用来获取正在运行的进程信息和系统的CPU和内存的利用率。 类似Linux的ps、top和Windows的任务管理器等程序。可以通过少量的代码来实现服务器资源的监控。

安装

因为是python的库,所以直接使用pip3来安装就行:

1
pip3 install psutil

示例

1
2
3
4
5
6
7
8
9
import psutil

# 获取CPU核心数,逻辑上的数量
psutil.cpu_count()
# 获取CPU实际的核心数
psutil.cpu_count(logical=False)
# 获取CPU一秒内的使用率
psutil.cpu_percent(interval=1)
...

psutil还可以获取网络,磁盘,线程,内存等等的信息。感兴趣的可以去查一下。

线程监控

首先我们需要对所有的线程进行监控。监控的内容包括,线程的pid, name, username, vms 以及运行时间(times)等等。对vms和时间的要求如下:

  1. vms使用率不超过95%
  2. times不超过24小时

vms的使用率很好算,直接通过简单的计算就能得到结果。但是程序运行的时间需要调用datetime的库进行运算。程序实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import psutil
import datetime

TIMELIMIT = 24 * 3600
MEMLIMIT = xx

users = {
'user1': 'email@email.com'
}

for proc in psutil.process_iter():
try:
proc_info = proc.as_dict(attrs=["pid", "name", "username"])
proc_info["vms"] = proc.memory_info().rss / 1024 / 1024 / 1024

ct = datetime.datetime.fromtimestamp(proc.create_time())
nt = datetime.datetime.now()
diff = nt - ct
proc_info["times"] = diff.total_seconds()
44
# avoid the root process
if proc_info["username"] not in users:
continue

# avoid the useless process
if proc_info["name"] in ["zsh", "screen", "systemd", "sshd"]:
continue

# running time
if proc_info["times"] >= TIMELIMIT:
# send email or other notice

# ram usage
if proc_info["vms"] >= MEMLIMIT:
# send email or other notice

except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
pass

发邮件的方法可以参考smtplib库。

服务器监控

我们不仅需要对线程进行监控,我们还需要对服务器整体状态进行监控,这个比较简单。程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
MINMEM = 4 # 4GB
MAXCPU = 97 # 97%


def check_server_mem():
"""
check the server free memory
@return: True if mempry free is not enough
"""
mem = psutil.virtual_memory()
free = float(mem.free) / 1024 / 1024 / 1024

if free > MINMEM:
return True

return False


def check_server_cpu():
"""
check the server cpu usage
@return: True if the cpu usage more than MAX
"""
cpu = psutil.cpu_percent(3)

if cpu >= MAXCPU:
return True

return False

检测到服务器没有足够多的内存的时候我们可以强制停止正在运行的进程,避免宕机的存在。

部署

我们可以通过使用schedule库来进行一个周期执行程序。比如我们可以每10分钟检查一次服务器的状态,每10个小时检查一下进程的运行时间等等。比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import schedule

def check_process():
"""
checking the running process
@return:
"""
pass


def check_server():
"""
checking the server
@return:
"""
check_server_mem()
check_server_cpu()


if __name__ == "__main__":
schedule.every(10).minutes.do(check_server)
schedule.every(11).hours.do(check_process)

while True:
schedule.run_pending()
time.sleep(1)

在程序休眠的时候是不占用CPU资源的,所以大家不用担心改程序会占用太多资源,并且这个程序可以在几秒内完成检查,对CPU的使用基本可以忽略不记。

----- End Thanks for reading-----