我正在尝试在一个文件中编写一个 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 -o
ping
收到第一个数据包后退出> /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:~$