前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux:根据主进程查找子进程

linux:根据主进程查找子进程

作者头像
10km
发布2019-09-18 10:57:00
4.9K0
发布2019-09-18 10:57:00
举报
文章被收录于专栏:10km的专栏10km的专栏

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/10km/article/details/100603320

如下是我的项目中创建的一个java系统服务在通过systemctl status显示的服务状态

代码语言:javascript
复制
$ systemctl status facelog
● facelog.service - facelog service
   Loaded: loaded (/etc/systemd/system/facelog.service; enabled; vendor preset: enabled)
   Active: active (running) since 六 2019-09-07 17:25:29 CST; 27min ago
     Docs: https://gitee.com/l0km/facelog
  Process: 894 ExecStop=/home/gyd/workspace/facelog-delivery/facelog stop (code=exited, status=0/SUCCESS)
 Main PID: 1088 (facelog)
   CGroup: /system.slice/facelog.service
           ├─1088 /bin/bash /home/gyd/workspace/facelog-delivery/facelog start --hup
           ├─1482 /bin/bash ./facelog-service/target/start_facelog_server.sh
           └─1494 java -jar facelog-service-2.4.2-standalone.jar

9月 07 17:25:29 gyd systemd[1]: Stopped facelog service.
9月 07 17:25:29 gyd systemd[1]: Started facelog service.
9月 07 17:25:29 gyd facelog[1088]: 启动 facelog 服务(start facelog service)...
9月 07 17:25:30 gyd facelog[1088]: 执行 tail -f /home/gyd/workspace/facelog-delivery/facelog.out 查看控制台输出

可以发现服务产生了三个进程,进程ID分别为1088,1482,1494,从左到右为父/子进程关系.如果想通过netstat命令根据PID查找服务所占用的端口,就需要最右的java子进程ID。

但是通过systemctl show --property MainPID <service name> 命令只能获取最左边的父进程ID. 怎么样通过这个MainPID获取实际工作的子进程ID呢,ps的 -g选项可以根据PID过程要显示的所有属于指定PID的进程及子进程,比如:

代码语言:javascript
复制
$ ps --forest -o pid,cmd -g 1088
  PID CMD
 1088 /bin/bash /home/gyd/workspace/facelog-delivery/facelog start --hup
 1482  \_ /bin/bash ./facelog-service/target/start_facelog_server.sh
 1494      \_ java -jar facelog-service-2.4.2-standalone.jar

最后一行就是最后的子进程

这样就好办了。比如下面的过程可以获取指定服务的占用的端口:

代码语言:javascript
复制
	#!/bin/bash
	# 获取服务的MainPID,$service_name 为服务名称
	main_pid="$(systemctl show $service_name --property=MainPID)"
	main_pid=${main_pid##*=}
	# ps 命令获取最下层的子进程ID 
	spid=$(ps -o pid -g $main_pid | sed -e '1d' -e '$!d')
	# 输出端口号
	netstat -nlp 2>/dev/null|grep $spid|grep -E ':[[:digit:]]+' -o | sed 's/://g'
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年09月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档