当Linux中的另一个进程结束时终止后台进程
我有一个小问题,我希望有人能帮助我,因为我找不到合适的解决方案。当Linux中的另一个进程结束时终止后台进程
我想解析一个主机名;在等待结果时,如果需要超过30秒的shell脚本命令,最好是内置的或无处不在的系统命令,我想打印一个通知。
我有一个后台进程,睡觉,然后打印一条消息;在进入睡眠状态时,进程运行ping
,但我无法弄清楚如何在ping完成后终止后台进程,并且即使ping在30秒的时间限制之前结束,也会继续打印消息,因为这是更大脚本的一部分这需要一些时间来运行。
下面是我一直使用的代码:
((sleep 30; echo "Querying the DNS server takes more than 30 seconds.") & ping -q -c 1 localhost >/dev/null)
我将不胜感激任何和所有帮助。也欢迎其他解决方案;我只是想告诉用户DNS太慢,这会影响进一步的执行。我已经尝试了ping -w或-W,但这不是测量分辨率的时间。我试图捕获ping的结果。我试图杀死具有相同GPID的所有进程,但它也正在杀死控制台。我不是最好的脚本,也许这就是为什么这需要我很多时间。先谢谢你。
我希望这种方法可以帮助你。我认为一切都非常便携,除了“BC”也许。如果你需要的话,我可以给你一个“无BC”的版本。祝你好运!
#!/bin/bash
timeout=10; ## This is how long to wait before doing some batshit!
printed=1; ## this is how many times you want the message displayed (For #instance, you might want a message EVERY X seconds)
starttime="$(date +%F) $(date +%T.%3N)"
################### HERE GOES YOUR BACKGROUND PROCESS
sleep 30 &
#######################################################
processId=$! ## And here we got the procees Id
#######################################################
while [ ! -z "$(ps -ef | grep $processId | grep -v grep)" ]
do
endtime="$(date +%F) $(date +%T.%3N)";
timeelapsed=$(echo " $(date -d "$endtime" "+%s") - $(date -d "$starttime" "+%s") " | bc);
if [[ ($timeelapsed -gt $timeout) && ($printed -ne 0) ]]
then
echo "This is taking more than $timeout seconds";
printed=$((printed - 1));
starttime="$(date +%F) $(date +%T.%3N)"
fi
done
### Do something once everything finished
echo "The background process ended!!"
非常感谢。我会尽快检查它。看来它会做这项工作。 –
肯定的兄弟。只要记住要突出它是正确的,如果它稍后用于你。 (竖起大拇指) –
这看起来像一个问题https://superuser.com/ – Veltro
我不明白你有什么问题。你为什么要谈论“解决一些主机名”,然后你谈论“ping”。 – Jdamian
当您执行ping某个主机时,在ping本身之前主机解析为某个IP。我使用ping命令而不是dig或host(它们不是核心软件包的一部分)来衡量分辨率有多慢。 –