前言
有一段时间没写了,马上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:30
nohup
,用于在后台运行命令,比如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次top
grep "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
用于系统性能数据采集和报告
心态还是很难调整好,大道理学了这么久,发现都是讲给别人听的,根本治愈不了自己,该歇歇了~