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

云计算分享者 2024-02-24 02:14:01
背景

这两天写一个功能的时候,遇到一个问题,需要执行一个程序,并且把它的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/bashset -ex# 用来执行一个命令,并且把进程的pid写下来# bash runCmd.sh pidFile cmd arg1 arg2# cmd arg1 arg2pidFile=$1shiftcmd=$1shiftecho $$ > ${pidFile}exec ${cmd} $*

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

mycmd的第一个实例

mycmd的第二个实例

mycmd的第三个实例

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

总结

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

0 阅读:0

云计算分享者

简介:感谢大家的关注