安基网 欢乐生肖 脚本 Shell 查看内容

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

2019-9-14 01:53| 投稿: |来自:


免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!

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

背景

这两天写一个功能的时候,遇到一个问题,需要执行一个程序,并且把它的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.



小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!

本文出自:https://www.toutiao.com/a6736000046040351246/

免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!

刚表态过的朋友 (1 人)

相关阅读

最新评论

 最新
返回顶部
湖南快乐十分走势 快乐赛车平台 欢乐生肖 极速快3 快赢彩票计划 上海时时乐 三分快3 快乐赛车 极速快3 快乐赛车开奖