linux环境下使用timeout监控命令执行超过5分钟后发送通知

前言

有一段时间没写了,马上1024了,总得有点输出吧,想到最近用了一个挺有用的命令 timeout ,所以拿出来简单展示一下它的用法,作用就是可以给指定命令设置超时时间,相当于扩展了原命令,对于一般没有超时参数的命令是个方便的扩展方式,可以增加超时处理。

使用方法

使用方法也非常简单,下面是一个简单的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

# 设置超时时间(秒)
TIMEOUT=300

# 要监控的命令
./hooks/rsync.sh &

# 获取命令的进程ID
command_pid=$!

# 等待命令执行完成,或者直到超时
timeout $TIMEOUT tail --pid=$command_pid -f /dev/null

# 检查是否超时
if [ $? -eq 124 ]; then
echo "timeout"
iostat -d -x 2 9
else
echo "normal"
fi

tail --pid=$command_pid -f /dev/null 这个命令是用来等待指定进程 $command_pid 结束的同时保持脚本的运行,以确保后续的超时检查。

  • tail 是一个用于显示文件末尾内容的命令,通常用于查看日志文件。

  • --pid=$command_pidtail 命令的一个选项。它告诉 tail 命令在结束之前等待指定的进程 $command_pid 完成。这是通过监视 /proc/$command_pid/fd/1 文件(进程的标准输出)来实现的,以便在进程结束时 tail 命令也会退出。

  • -f /dev/null 表示 tail 命令要查看 /dev/null 文件的内容,但 /dev/null 文件是一个空文件,所以它不会产生输出。这里的目的是让 tail 命令一直运行,直到 $command_pid 进程结束。

这种构造的作用是等待命令执行完成,但在等待的过程中不产生输出。一旦 $command_pid 进程结束,tail 命令也会退出,允许脚本继续执行后续操作,如检查是否超时。

  • if [ $? -eq 124 ]; then ... else ...:这一段是条件语句,用于检查timeout命令的返回状态。如果返回状态是124,意味着rsync.sh脚本执行超时,那么它会打印”timeout”以指示发生了超时,并且运行iostat -d -x 2 9命令来获取磁盘I/O统计信息。

  • 如果timeout命令的返回状态不是124,即没有发生超时,它将执行else部分打印”normal”以指示命令正常执行。

其他有趣的命令

类似这种监控或者扩展的命令还有:

  • time,于测量命令执行的时间。它会运行一个命令,并报告命令执行所花费的实际时间(包括用户CPU时间和系统CPU时间),通常用于性能分析和优化。例如 time my_command
  • at,可以计划执行一次性任务,比如将在15:30执行命令echo "my_command" | at 15:30
  • nohup,用于在后台运行命令,比如 nohup my_command > output.log 2>&1 &

系统资源查询命令

1
2
3
4
5
date >> /tmp/slow.log
iostat -d -x 2 5 >> /tmp/slow.log
vmstat -n 2 5 >> /tmp/slow.log
sar -B 2 5 >> /tmp/slow.log
top -b -n 3 | grep "md5sum" >> /tmp/slow.log

有时发现系统总是被无故拖慢,有些进程迟迟不能结束,虽然有监控grafana大盘可以查,但是有些参数不太细致,可以上面展示的这些命令来临时查一下,它们的含义如下:

  1. iostat -d -x 2 5 >> /tmp/slow.log

    • iostat 用于报告系统磁盘活动和性能
    • -d 选项表示只显示磁盘相关的信息
    • -x 选项用于显示扩展的磁盘统计信息
    • 2 表示每隔2秒报告一次
    • 5 表示报告5次
  2. vmstat -n 2 5 >> /tmp/slow.log

    • vmstat 用于显示虚拟内存统计
    • -n 选项用于指定输出中不显示表头
  3. sar -B 2 5 >> /tmp/slow.log

    • sar 用于系统性能数据采集和报告
    • -B 选项用于报告缓冲区和页缓存统计信息
  4. top -b -n 3 | grep “md5sum” >> /tmp/slow.log

    • top 用于实时查看系统中正在运行的进程和其性能
    • -b 选项表示以批处理模式运行,适用于脚本
    • -n 3 表示运行3次 top
    • grep "md5sum" 用于筛选包含 “md5sum” 的行,以查找与 “md5sum” 相关的进程
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
39
40
41
42
43
44
45
46
47
Fri Oct 20 13:36:31 CST 2023
Linux 3.10.0-1160.88.1.el7.x86_64 (demo-machine) 10/20/2023 >_x86_64_ (8 CPU)

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz >avgqu-sz await r_await w_await svctm %util
fd0 0.00 0.00 0.00 0.00 0.00 0.00 8.00 >0.00 136.50 136.50 0.00 136.50 0.00
sdb 0.00 0.00 1.98 0.02 179.62 6.55 186.84 >0.06 32.16 30.23 265.38 1.45 0.29
sda 0.00 0.02 0.01 0.23 0.27 1.98 18.70 >0.00 9.97 103.14 6.89 1.96 0.05

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz >avgqu-sz await r_await w_await svctm %util
fd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 >0.00 0.00 0.00 0.00 0.00 0.00
sdb 0.00 0.00 1.47 0.00 598.04 0.00 813.33 >0.13 86.33 86.33 0.00 42.33 6.23
sda 0.00 0.00 0.49 0.98 3.92 2.70 9.00 >0.01 10.00 30.00 0.00 10.00 1.47

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz >avgqu-sz await r_await w_await svctm %util
fd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 >0.00 0.00 0.00 0.00 0.00 0.00
sdb 0.00 0.00 0.99 0.00 392.08 0.00 792.00 >0.02 19.00 19.00 0.00 9.50 0.94
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 >0.00 0.00 0.00 0.00 0.00 0.00

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz >avgqu-sz await r_await w_await svctm %util
fd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 >0.00 0.00 0.00 0.00 0.00 0.00
sdb 0.00 0.00 4.00 0.00 1776.00 0.00 888.00 >0.06 15.25 15.25 0.00 2.62 1.05
sda 0.00 0.00 0.00 1.50 0.00 6.00 8.00 >0.00 2.00 0.00 2.00 0.67 0.10

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz >avgqu-sz await r_await w_await svctm %util
fd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 >0.00 0.00 0.00 0.00 0.00 0.00
sdb 0.00 0.00 4.23 0.00 2066.15 0.00 976.73 >0.13 31.00 31.00 0.00 3.55 1.50
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 >0.00 0.00 0.00 0.00 0.00 0.00

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 162364 0 12586664 0 0 23 1 0 1 0 0 100 0 0
2 0 0 158892 0 12565264 0 0 0 0 3209 413 0 8 92 0 0
2 0 0 165976 0 12543900 0 0 0 0 1879 332 0 5 95 0 0
2 0 0 163496 0 12523372 0 0 396 0 2844 678 0 8 92 0 0
3 0 0 162240 0 12502092 0 0 0 0 2038 574 0 7 93 0 0
Linux 3.10.0-1160.88.1.el7.x86_64 (demo-machine) 10/20/2023 >_x86_64_ (8 CPU)

01:36:48 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s >pgsteal/s %vmeff
01:36:50 PM 1674.00 0.00 3098.00 0.00 3431.00 3362.00 >0.00 3362.00 100.00
01:36:52 PM 0.00 0.00 2874.50 0.00 2675.00 2650.50 >0.00 2650.50 100.00
01:36:54 PM 2822.00 0.00 2478.50 0.00 2666.50 2645.00 >0.00 2645.00 100.00
01:36:56 PM 0.00 0.50 1248.50 0.00 156173.00 2642.00 >0.00 2642.00 100.00
01:36:58 PM 0.00 0.00 1975.00 0.00 321.50 0.00 >0.00 0.00 0.00
Average: 899.20 0.10 2334.90 0.00 33053.40 2259.90 0.00 2259.90 100.00
5667 root 20 0 1455484 54400 1256 R 100.0 0.3 3:54.39 md5sum
5667 root 20 0 1455484 75784 1256 R 100.0 0.5 3:57.40 md5sum
5667 root 20 0 1455484 98752 1256 R 100.0 0.6 4:00.41 md5sum

总结

  • timeout 可以给其他命令设置超时时间
  • at 可以计划执行一次性任务
  • iostat -d -x 2 5 用于报告系统磁盘活动和性能
  • vmstat -n 2 5 用于显示虚拟内存统计
  • sar -B 2 5 用于系统性能数据采集和报告

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

心态还是很难调整好,大道理学了这么久,发现都是讲给别人听的,根本治愈不了自己,该歇歇了~

Albert Shi wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客