当另一个进程以 Linux 结束时终止后台进程
Kill background process when another process ends in Linux
我有一个小问题,我找不到合适的解决方案,希望有人能帮助我。
我想解析一个主机名;在等待结果的同时,如果使用 shell 脚本命令(最好是内置命令或无处不在的系统命令)需要超过 30 秒,我想打印一条通知。
我有一个休眠然后打印消息的后台进程;睡觉时,进程 运行s 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-less" 版本。祝你好运!
#!/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!!"
我有一个小问题,我找不到合适的解决方案,希望有人能帮助我。
我想解析一个主机名;在等待结果的同时,如果使用 shell 脚本命令(最好是内置命令或无处不在的系统命令)需要超过 30 秒,我想打印一条通知。
我有一个休眠然后打印消息的后台进程;睡觉时,进程 运行s 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-less" 版本。祝你好运!
#!/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!!"