首页 运维 脚本开发 查看内容

巧用bash的exec进行进程PID记录

2019-9-14 01:53 |来自: 互联网 3415 0

摘要: 背景这两天写一个功能的时候,遇到一个问题,需要执行一个程序,并且把它的PID记录到一个文件中,因为这程序可能会运行很多个,如果不把PID记录下来,等会儿再来杀进程的时候,就不知道杀哪个了.但是这个程序本身并没有实现记录自己的PID到文件的功能.比如下面这个程序mycmd,系统上一共启动了3个实例,现在需要 ...
关键词: 进程 PID 程序 命令 实例 运行 参数 exec bash

背景

这两天写一个功能的时候,遇到一个问题,需要执行一个程序,并且把它的PID记录到一个文件中,因为这程序可能会运行很多个,如果不把PID记录下来,等会儿再来杀进程的时候,就不知道杀哪个了.但是这个程序本身并没有实现记录自己的PID到文件的功能.

比如下面这个程序mycmd,系统上一共启动了3个实例,现在需要去杀掉其中一个,但是因为在启动的时候,并没有记录自己启动的那个进程的PID,不知道应该杀那个. 这个程序又是别人的,也没有办法让他加一个存放PID的选项.

使用bash的exec功能记录任何进程的PID

bash的exec命令可以让bash进程直接载入新的ELF文件到自己的text段,然后重新开始运行这个新的ELF文件,而且可以保持进程的PID不变.也就是进程其他东西都不变,只是运行的代码完全换成新的. 使用这个功能,我们可以很方便的完成给任意程序记录PID的能力.

如下面的runCmd.sh脚本,这个脚本需要的第一个参数是程序启动之后的PID需要被记录的文件,第二个参数是要执行的命令,后面的参数是执行这个命令需要的参数.注意通过将pidFile和cmd shift掉,剩下的参数全部都在$*里面了.$$是bash进程的PID. 注意这儿的exec一定是最后一条命令,因为exec执行完成之后,这个进程里面执行的就不是bash了,而是cmd.

#cat runCmd.sh
#!/bin/bash
set -ex
# 用来执行一个命令,并且把进程的pid写下来
# bash runCmd.sh pidFile cmd arg1 arg2
# cmd arg1 arg2
pidFile=$1
shift
cmd=$1
shift
echo $$ > ${pidFile}
exec ${cmd} $*

使用这个脚本运行mycmd3个实例,记录pid分别到pid1,pid2,pid3.

mycmd的第一个实例

mycmd的第二个实例

mycmd的第三个实例

此时pid1,pid2,pid3记录的pid和ps -ef的输出一致,这样要杀其中一个进程的时候,就知道该杀哪个了.

总结

bash的exec命令可以直接将bash进程的text段给换掉,到达运行一个新的程序,但是进程的其他东西都不变的效果,通过在exec之前将进程的PID记录下来,可以给任何程序记录PID.

本文出处: https://www.toutiao.com/a6736000046040351246/
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手
1

鲜花

鸡蛋

刚表态过的朋友 (1 人)

最新评论

返回顶部