题
我希望能够在很长一段时间内每秒精确地运行UNIX命令。
我需要一个解决方案,该解决方案在一定时间后不会落后,因为命令本身需要执行时间。在这方面,sleep,watch和某些python脚本都使我失败了。
在诸如http://Arduino.cc之类的微控制器上,我将通过硬件时钟中断来实现。我想知道是否存在类似的时间精确的shell脚本解决方案。我在StackExchange.com中找到的所有解决方案,如果运行数小时,将导致明显的时间延迟。请参阅下面的详细信息。
实际用途/应用
我想通过nc
每1秒通过(netcat)发送时间戳来测试我的网络连接是否连续不断。
发件人:
precise-timestamp-generator | tee netcat-sender.txt | nc $receiver $port
接收方:
nc -l -p $port > netcat-receiver.txt
完成后,比较两个日志:
diff netcat-sender.txt netcat-receiver.txt
差异将是未传输的时间戳。由此,我会知道我的LAN / WAN / ISP在什么时候出现问题。
解决方案休眠
while [ true ]; do date "+%Y-%m-%d %H:%M:%S" ; sleep 1; done | tee timelog-sleep.txt
随着时间的推移获得一定的偏移量,因为循环内的命令也需要一些时间。
精确
cat timelog-sleep.txt
2012-07-16 00:45:16
[...]
2012-07-16 10:20:36
秒已逝:34520
wc -l timelog-sleep.txt
文件中的行:34243
精度总结:
- 34520-34243 = 277时序问题
- 34520/34243 = 1.008 = 0.8%折扣
解决方案重复台球
发现于:永远每x秒重复一次Unix命令
repeat.py 1 "date '+%Y-%m-%d %H:%M:%S'" >> timelog-repeat-py.txt
本来可以避免时间偏移,但不能这样做。
精确
wc -l timelog-repeat-py.txt
2012-07-16 13:42:44
[...]
2012-07-16 16:45:24
秒已过:10960
wc -l timelog-repeat-py.txt
文件中的行数:10859
精度总结:
- 10960-10859 = 101计时问题
- 10960/10859 = 1.009 = 0.9%折扣
解决方案观察
watch -n 1 "date '+%Y-%m-%d %H:%M:%S' >> ~/Desktop/timelog-watch.txt"
精确
wc -l timelog-watch.txt
2012-07-16 11:04:08
[...]
2012-07-16 13:25:47
秒已过:8499
wc -l timelog-watch.txt
文件中的行数:8366
精度总结:
- 8499-8366 = 133计时问题。
- 8499/8366 = 1.016 = 1.6%折扣
nice
进入休眠状态,会发生什么?