首页 > 解决方案 > 如何跟踪由 bash 脚本分叉的进程?

问题描述

不是纯粹的 bash 问题,但需要 bash 和 kubernetes cli 的组合知识才能完全回答。我想用 kubernetes 和其他工作(如远程呈现)一起做一些端口转发的事情,我的 bash 脚本就是这样做的:

# Killing all kubectl port forwards that might remain after previous launch.
kill $(pidof kubectl)
#run kube-proxy to tunnel port 2828 to the my pod on k8s
kubectl port-forward deployment/my 2828:2828 -n myns  & 
#wait for proxy to establish
sleep 10

这个脚本有缺点

我该如何解决提到的缺点?

标签: bashcommand-line-interfacekubectlfork-join

解决方案


您应该跟踪已创建kubectl进程的 pid,并可能将其存储在“锁定”文件中。

像:pid=$!echo $! > lockfile

然后在脚本的开头,您可以检查该锁定文件并终止该进程:

pid=$(<lockfile)
kill "$pid"
kubectl port-forward deployment/my 2828:2828 -n myns  & 
pid=$!
echo "$pid" > lockfile

通过这种方式,您还可以检查进程是否已在运行或已停止:

pid=$(<lockfile)
if ps "$pid" 2>&1 >/dev/null
then
  echo "Already running, no need to restart"
  exit 0
fi
kubectl port-forward deployment/my 2828:2828 -n myns  & 
pid=$!
echo "$pid" > lockfile

kubectl但是,如果分叉并停止父进程,这将不起作用。


推荐阅读