用于检查主机可用性的 Bash ping 脚本文件

用于检查主机可用性的 Bash ping 脚本文件

我正在尝试在一个文件中编写一个 bash 脚本,该脚本在运行时会开始 ping 主机直到它可用,当主机变得可访问时,它会运行命令并停止执行,我尝试编写一个,但脚本会继续 ping 直到计数结束,

另外,我需要将该进程放在后台,但如果我使用美元 ( $) 符号运行脚本,它仍然在前台运行,

#!/bin/bash
ping -c30 -i3 192.168.137.163
if [ $? -eq 0 ]
then /root/scripts/test1.sh
exit 0
else echo “fail”
fi

答案1

我会用这个,一个简单的单行:

while ! ping -c1 HOSTNAME &>/dev/null; do echo "Ping Fail - `date`"; done ; echo "Host Found - `date`" ; /root/scripts/test1.sh

替换HOSTNAME为您尝试 ping 的主机。


我错过了将其放在后台的部分,将该行放入 shell 脚本中,如下所示:

#!/bin/sh

while ! ping -c1 $1 &>/dev/null
        do echo "Ping Fail - `date`"
done
echo "Host Found - `date`"
/root/scripts/test1.sh

为了让它成为后台,你可以像这样运行它:

nohup ./networktest.sh HOSTNAME > /tmp/networktest.out 2>&1 &

再次替换HOSTNAME为您尝试 ping 的主机。在这种方法中,您将主机名作为参数传递给 shellscript。

正如一般警告一样,如果您的主机处于关闭状态,您将让该脚本在后台持续执行 ping 操作,直到您杀死它或找到主机。所以当你运行这个时我会记住这一点。因为如果您忘记了这一点,您最终可能会耗尽系统资源。

答案2

通过将参数“-c 30”传递给 ping,它将尝试 30 ping 并停止。它将检查命令是否成功。我认为最好执行一个包含一个 ping 的循环,并检查此 ping 是否成功。像这样的东西:

while true;
do
  ping -c1 google.com
  if [ $? -eq 0 ]
  then 
    /root/scripts/test1.sh
    exit 0
  fi
done

如果仍然在前台运行,则意味着它仍在终端上打印,您可以将 stdin 和 stdout 重定向到 /dev/null 。

答案3

ping -oc 100000 Hostname > /dev/null && /root/scripts/test1.sh 
  • ping -oping收到第一个数据包后退出
  • > /dev/null重定向输出,这样你就看不到它了
  • &&如果上一个命令成功,将运行下一个命令

此外,您可以通过添加到任何&进程的末尾来在后台运行任何进程;例如,echo "123" &将在后台运行

答案4

这是您的脚本的工作修改。

#!/bin/bash
ping -c1 10.1.1.23 > /dev/null
if [ $? -eq 0 ]
  then 
    echo ok 
    exit 0
  else
    echo “fail”
fi

您需要将输出发送到,/dev/null以便它不会出现在屏幕上。

-c是为了计数。如果您输入-c30,您将需要 ping 30 次,然后脚本才能进入下一行。我用来-c1让脚本运行得更快。

-i是在发送每个数据包之间等待几秒钟。所以-i3就是等3秒。我删除是-i为了使脚本运行得更快。

最后但并非最不重要的一点是,使用缩进,使您的代码看起来更美观且更易于阅读。

样本输出

user@linux:~$ ./script.sh 
ok
user@linux:~$

user@linux:~$ ./script.sh 
“fail”
user@linux:~$ 

相关内容