| 关键词: 进程 PID 程序 命令 实例 运行 参数 exec bash |
背景这两天写一个功能的时候,遇到一个问题,需要执行一个程序,并且把它的PID记录到一个文件中,因为这程序可能会运行很多个,如果不把PID记录下来,等会儿再来杀进程的时候,就不知道杀哪个了.但是这个程序本身并没有实现记录自己的PID到文件的功能. 比如下面这个程序mycmd,系统上一共启动了3个实例,现在需要去杀掉其中一个,但是因为在启动的时候,并没有记录自己启动的那个进程的PID,不知道应该杀那个. 这个程序又是别人的,也没有办法让他加一个存放PID的选项. 使用bash的exec功能记录任何进程的PIDbash的exec命令可以让bash进程直接载入新的ELF文件到自己的text段,然后重新开始运行这个新的ELF文件,而且可以保持进程的PID不变.也就是进程其他东西都不变,只是运行的代码完全换成新的. 使用这个功能,我们可以很方便的完成给任意程序记录PID的能力. 如下面的runCmd.sh脚本,这个脚本需要的第一个参数是程序启动之后的PID需要被记录的文件,第二个参数是要执行的命令,后面的参数是执行这个命令需要的参数.注意通过将pidFile和cmd shift掉,剩下的参数全部都在$*里面了.$$是bash进程的PID. 注意这儿的exec一定是最后一条命令,因为exec执行完成之后,这个进程里面执行的就不是bash了,而是cmd. #cat runCmd.sh 使用这个脚本运行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/ |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|