如何在Bash脚本中运行程序,只要其他程序并行运行?



我有两个程序serverclientserver在未知持续时间后终止。我想并行运行clientserver(都来自同一个Bash脚本),并在server终止(自己终止)后几秒钟自动终止client

如何做到这一点?

我可以在bash脚本中并行运行多个程序,并在bash中超时一个命令,而没有不必要的延迟,但是我不知道服务器的执行时间,所以我不能简单地为客户端定义超时。脚本应该继续运行,因此退出脚本以终止子进程是不可取的。

编辑这个问题只涉及等待两个进程自然终止,而不是在server进程终止后如何杀死client进程。

@tripleee在Unix SE的评论中指出了这个问题,可以工作,特别是在终止顺序无关的情况下。

#!/bin/bash
execProgram(){
case $1 in
server)
sleep 5 &  # <-- change "sleep 5" to your server command.
# use "&" for background process    
SERVER_PID=$!
echo "server started with pid $SERVER_PID"
;;
client)
sleep 18 &  # <-- change "sleep 18" to your client command
# use "&" for background process
CLIENT_PID=$!
echo "client started with pid $CLIENT_PID"
;;
esac
}
waitForServer(){
echo "waiting for server"
wait $SERVER_PID
echo "server prog is done"
}
terminateClient(){
echo "killing client pid $CLIENT_PID after 5 seconds"
sleep 5
kill -15 $CLIENT_PID >/dev/null 2>&1
wait $CLIENT_PID >/dev/null 2>&1
echo "client terminated"
}
execProgram server && execProgram client
waitForServer && terminateClient

使用GNU Parallel你可以做:

server() {
sleep 3
echo exit
}
client() {
forever echo client running
}
export -f server client
# Keep client running for 5000 ms more
# then send TERM and wait 1000 ms
# then send KILL
parallel -u --termseq 0,5000,TERM,1000,KILL,1 --halt now,success=1 ::: server client

最新更新