前言
有一段时间没写了,马上1024了,总得有点输出吧,想到最近用了一个挺有用的命令 timeout
,所以拿出来简单展示一下它的用法,作用就是可以给指定命令设置超时时间,相当于扩展了原命令,对于一般没有超时参数的命令是个方便的扩展方式,可以增加超时处理。
使用方法
使用方法也非常简单,下面是一个简单的示例:
#!/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_pid
是tail
命令的一个选项。它告诉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 &
系统资源查询命令
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大盘可以查,但是有些参数不太细致,可以上面展示的这些命令来临时查一下,它们的含义如下:
-
iostat -d -x 2 5 >> /tmp/slow.log:
iostat
用于报告系统磁盘活动和性能-d
选项表示只显示磁盘相关的信息-x
选项用于显示扩展的磁盘统计信息2
表示每隔2秒报告一次5
表示报告5次
-
vmstat -n 2 5 >> /tmp/slow.log:
vmstat
用于显示虚拟内存统计-n
选项用于指定输出中不显示表头
-
sar -B 2 5 >> /tmp/slow.log:
sar
用于系统性能数据采集和报告-B
选项用于报告缓冲区和页缓存统计信息
-
top -b -n 3 | grep “md5sum” >> /tmp/slow.log:
top
用于实时查看系统中正在运行的进程和其性能-b
选项表示以批处理模式运行,适用于脚本-n 3
表示运行3次top
grep "md5sum"
用于筛选包含 “md5sum” 的行,以查找与 “md5sum” 相关的进程
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
用于系统性能数据采集和报告