如何为fping重定向后的「host unreachable」错误信息添加时间戳?
这个问题我之前也碰到过——fping的标准输出可能自带一些状态标识,但标准错误流里的「host unreachable」这类报错确实不会自动加上时间戳,重定向到文件后就很难定位问题发生的时间点。这里有几个实用的解决办法,按上手难度排序:
1. 用ts工具(最省心的方案)
ts是moreutils工具集里的一个小工具,专门用来给每行输出打时间戳,用法超简单。首先得确保你的系统安装了moreutils:
- Debian/Ubuntu系:
sudo apt install moreutils - RHEL/CentOS系:
sudo yum install moreutils
然后用进程替换把stderr单独引出来处理,再和stdout合并到同一个日志文件:
# 替换成你的fping参数,比如-f hosts.txt指定目标主机列表 fping -f hosts.txt 2> >(ts '[%Y-%m-%d %H:%M:%S]' >> fping.log) > fping.log
这个命令里,2> >(...)会把fping的标准错误流传给ts工具,ts给每行加上时间戳后追加到日志文件;而标准输出流则直接写入同一个日志文件,互不干扰。
2. 用awk+bash内置功能(无需额外安装工具)
如果不想装新软件,用bash的进程替换配合awk也能搞定。awk自带strftime函数可以生成时间戳,直接处理stderr即可:
fping -f hosts.txt 2> >(awk '{print strftime("[%Y-%m-%d %H:%M:%S]"), $0}' >> fping.log) > fping.log
效果和用ts一样,只是把加时间戳的工作交给了awk,适合不能随便装软件的服务器环境。
3. 给所有输出统一加时间戳(可选)
如果希望不管是正常输出还是错误信息,所有内容都带上时间戳,也可以把fping的所有输出(stdout+stderr)都通过ts处理:
fping -f hosts.txt 2>&1 | ts '[%Y-%m-%d %H:%M:%S]' > fping.log
不过要注意,如果fping的标准输出本身已经带有时间信息,这么做会导致时间戳重复,所以根据你的实际需求选择就好。
小提示
时间戳的格式可以自定义,比如用ts '%F %T'或者awk里的strftime("%F %T"),%F是YYYY-MM-DD,%T是HH:MM:SS,写出来更简洁。另外,进程替换是bash的特性,如果你的默认shell是sh,可能需要先切换到bash再执行命令。
内容的提问来源于stack exchange,提问作者jonathan_whitelist

