我写了这个脚本:
#!/bin/bash
target="1.1.1.1"
while true;
do
ping $target -c 1 -v > /dev/null
if [[ $? -ne 0 ]]; then
echo "$(date +"%d/%m/%y %R:%S")" >> netStabilityLog
fi
sleep 5s
done
它工作得几乎完美,只有一个问题。在输出文件中netStabilityLog
,我得到:
28/06/22 17:19:26
28/06/22 17:20:06
28/06/22 17:45
28/06/22 18:36:00
28/06/22 18:51
有时,秒数不会显示。这是为什么?
答案1
看来您可能同时运行了多个略有不同的脚本副本,每个副本都写入同一个输出文件。至少有一个正在运行的脚本版本没有在其输出中添加秒数。
至于脚本本身,我可以给出我的看法,它摆脱了外部date
实用程序,并且以不同的方式进行条件输出和重定向。它还整理了丢失的引用。
#!/bin/bash
ipaddr=1.1.1.1
while true; do
if ! ping -c 1 "$ipaddr" >/dev/null 2>&1
then
printf '%(%d/%m/%y %T)T\n' -1
fi
sleep 5
done >>netStabilityLog
这使用4.2 版本中引入的%(...)T
格式化字符串。该参数导致在创建输出时间戳时使用当前时间。它也不会针对每个调用进行重定向,而是仅针对外循环重定向一次。printf
bash
-1
printf
printf
$?
该代码通过直接使用ping
with来摆脱显式测试if
。不会ping
调用 with -v
(用于详细输出),因为我们无论如何都会丢弃输出。