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

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

$ 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的进程及子进程,比如:

$ 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

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

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

	#!/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'
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值