前言
有一段时间没写了,马上1024了,总得有点输出吧,想到最近用了一个挺有用的命令 timeout ,所以拿出来简单展示一下它的用法,作用就是可以给指定命令设置超时时间,相当于扩展了原命令,对于一般没有超时参数的命令是个方便的扩展方式,可以增加超时处理。
使用方法
使用方法也非常简单,下面是一个简单的示例:
1 |
|
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:30nohup,用于在后台运行命令,比如nohup my_command > output.log 2>&1 &
系统资源查询命令
1 | date >> /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次topgrep "md5sum"用于筛选包含 “md5sum” 的行,以查找与 “md5sum” 相关的进程
1 | Fri Oct 20 13:36:31 CST 2023 |
总结
timeout可以给其他命令设置超时时间at可以计划执行一次性任务iostat -d -x 2 5用于报告系统磁盘活动和性能vmstat -n 2 5用于显示虚拟内存统计sar -B 2 5用于系统性能数据采集和报告
心态还是很难调整好,大道理学了这么久,发现都是讲给别人听的,根本治愈不了自己,该歇歇了~