前言

有一段时间没写了,马上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_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 &

系统资源查询命令

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” 相关的进程
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 用于系统性能数据采集和报告


10-24 00:53