Linux watch循环命令
在Linux中,我们可能会需要反复的执行一个命令以查看状态的变化,比如之前我在启动一个项目的时候没有什么反应,于是我便自己写脚本反复
curl
这个端口,下面用输出Hello World
举出这个例子:
#!/bin/bash
i=1
for(($i;$i>0; i=$i+1))
do
echo 'Hello World'[$i]
sleep 1
done
我们的需求是非常简单地,只需要不断地间隔一秒输出Hello World
,但是却需要7行shell代码,这无疑非常非常麻烦,对于我这种对shell语法不熟悉的人还很花时间。
不过,其他开发者们显然也遇到过这种情况,并且已经有人写出了应对这种情况的工具,——watch
;
Watch
命令
watch [可选参数] [命令]
加*
为常用的参数
-n
* : 间隔秒数(如果不写默认间隔2秒)-d
* : different,只写这个参数的话,本次刷新发生变化内容会高亮,再次刷新若无变化则不高亮,若是给-d加参数-d=cumulative
则变化后高亮,再次刷新没有变化的话依旧保持高亮状态-g
*: 若是输出的内容发生变化则退出watch状态-t
: 不写-t的话watch有一个顶上的标题,会显示间隔秒数,当前时间等,加上-t则不显示该标题-b
: 若是命令因错误而退出,则发出警报声-e
: 停止错误输出更新并在按键后退出命令-c
: 解释 ANSI 颜色和样式序列-x
: 将用户定义的命令传递给exec,从而减少额外引用的需要-w
: 关闭换行并截断长行-h
: 显示帮助文本并退出。-v
: 显示版本信息并退出。
(1)watch 命令定义了4个观察事件点,即 -b 方法调用前,- e 方法异常后,- s 方法返回后, f 方法结束后。有点像string里面的,切入点面向切入编程,实际上有这个前置通知,后置通知,环绕通知,异常通知还有最终通知。所以可以猜测,Arthas在编写的时候用了同样的代理模式,类似于string框架的模式,对他四个的观察点进行监视,这个虽然没有看到源码,但是可以猜测应该是这样实现的。
(2)4个观察事件点 b 、- e 、- s 默认关闭,- f 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出。f默认打开,不管你有没有出现异常都能够看到结果
(3)这里要注意方法入参和方法出参的区别,有可能在中间被修改导致前后不一致,除了 b 事件点 params 代表方法入参外,其余事件都代表方法出参
(4)当使用 b 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在
举个🌰
监控当前时间变化
watch 'date' # 间隔2秒监控当前时间变化
watch -n 1 'date' # 间隔1秒监控当前时间变化
watch -d -n 1 'date' # 间隔1秒监控当前时间变化,并将当前变化的内容高亮显示
watch -d=cumulative -n 1 'date' # 间隔1秒监控当前时间变化,并将曾经发生过变化的内容持续高亮显示
watch -g 'date' # 间隔2秒监控时间变化,若是时间发生了变化则退出watch
以上的最后一条命令是一定会在2秒之后退出的,因为秒数从
i
变成了i+2
,触发了「输出内容发生变化」,因此直接退出watch状态。
📜 参考资料
「PhoneixNAP」: How to Use the Linux watch Command with Examples
「阿里云开发者社区」:Watch 命令的参数介绍 | 学习笔记