bash - 如何跟踪由 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
这个脚本有缺点
- 杀死所有 kubectl,不仅是我的
- 不会在脚本末尾杀死 kubectl(它是否可以优雅地处理 ctrl+c 和“加入”进程而不是杀死它)?
- 可能比需要的睡眠时间更长(我可以跟踪是否建立了 kubectl 服务器并且脚本可以继续吗?)
- kubectl 错误未处理(如果发生错误应退出)
我该如何解决提到的缺点?
解决方案
您应该跟踪已创建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
但是,如果分叉并停止父进程,这将不起作用。
推荐阅读
- angular - API 调用后未加载下拉值
- jmeter - 在桌面上执行性能测试的工具?
- botframework - 使用 Bot Framework SDK V4 进行 Azure AD 身份验证
- insert - 如何在 KDB(KX 数据库)中插入记录
- wordpress - 由于 301,Google 无法抓取网站
- android - 在 FCM 消息传递中实施谷歌日历后,我的应用程序崩溃
- javascript - How do I set localStorage items in Angular 4.4.6?
- java - 如何在实体类上为两种不同的列组合添加唯一约束
- r - 如何在不使用调查设计的情况下计算调查数据的 R 估计标准误差?
- scala - 为什么 Scala 匹配元组失败