免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 17856 | 回复: 26
打印 上一主题 下一主题

如何禁止一个程序重复运行? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-19 18:26 |只看该作者 |倒序浏览
如果一个程序一旦运行起来,那么如果本用户或者别的用户企图再次运行本程序,就给出一个警告
并且自动退出,有没有什么好的办法?

论坛徽章:
0
2 [报告]
发表于 2007-07-19 19:03 |只看该作者
1. 在程序启动的时候检查一遍现在运行着的进程ps -elf 等命令, 有没有进程名和当前进程名相同的进程(且路径也相同), 如果有多于一个, 则发出警告. 并退出.
2. 每次程序启动时都读取一个配置文件, 文件中初始值为0, 只要有进程启动, 则将其改为1, 程序退出时再改为0. 如果启动时检查这个文件为1了, 则警告并退出. 不过此时需要对文件采取锁, 以防止并发问题.

[ 本帖最后由 scutan 于 2007-7-19 19:04 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2007-07-19 20:36 |只看该作者
一般都使用文件锁,例如/var/log/foo.pid

论坛徽章:
0
4 [报告]
发表于 2007-07-20 09:38 |只看该作者
多谢楼上二位的指点,不过似乎都有漏洞
第一种方法检查当前运行的进程,如果用户把可执行程序的文件名修改了,那么这个办法就没有用了
第二种方法,如果程序遭遇到不可预料的退出,比如异常或者被用户强制结束,那么在重新启动操作系统之前就不能再次运行程序了

有没有完美一点的解决方案呢?

论坛徽章:
0
5 [报告]
发表于 2007-07-20 10:59 |只看该作者
原帖由 EastNoFail 于 2007-7-20 09:38 发表
多谢楼上二位的指点,不过似乎都有漏洞
第一种方法检查当前运行的进程,如果用户把可执行程序的文件名修改了,那么这个办法就没有用了
第二种方法,如果程序遭遇到不可预料的退出,比如异常或者被用户强制结束 ...


异常或者接受信号这些处理应该在你的程序有吧,比如atexit或者信号处理函数

论坛徽章:
0
6 [报告]
发表于 2007-07-20 11:13 |只看该作者
原帖由 EastNoFail 于 2007-7-20 09:38 发表
多谢楼上二位的指点,不过似乎都有漏洞
第一种方法检查当前运行的进程,如果用户把可执行程序的文件名修改了,那么这个办法就没有用了
第二种方法,如果程序遭遇到不可预料的退出,比如异常或者被用户强制结束 ...


第一种方法是有缺陷,不过在使用第二种方法的时候.
开启一个进程, 在该进程中打开某个配置文件, 进程操作, 然后fork一个子进程, 在该子进程中调用exec()来执行你的程序, 然后父进程就wait(), 一直阻塞在那个地方. 成为后台程序, 然后你的子进程在退出时会向父进程发送信号, 此时再由父进程来完成关闭那个配置文件的操作. 虽然这样, 父进程也可能会因为某种原因退出. 但是其机率应该比较小. 因为父进程中的操作比较少.

论坛徽章:
0
7 [报告]
发表于 2007-07-20 11:23 |只看该作者
to wawxdyy:
谢谢你的回复,我试过了,我的程序直接使用kill杀不死,智能使用kill -9来杀死
这样杀死的话,atexit注册的退出处理函数得不到机会运行的,而且信号也捕获不到的

论坛徽章:
0
8 [报告]
发表于 2007-07-20 12:25 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
9 [报告]
发表于 2007-07-20 13:10 |只看该作者
原帖由 jamesr 于 2007-7-20 12:25 发表
建/var/run/xxx.pid,再次启动程序时看看xxx.pid中记录的进程号在/proc中是否存在,若不存在,则上次是意味退出,重写xxx.pid并继续程序;若存在,则程序正在运行。


照啊,以前没仔细想过为什么会在pid文件里写入进程号,看来就像这位兄弟说的用来处理异常情况的,简单有效,楼主还是用这种办法吧,看来信号处理函数不太合适,太麻烦,另外像SIGKILL,SIGSTOP这两个信号是不能被捕捉的,atexit可以用来在正常终止的时候删除pid文件等一些收尾工作

[ 本帖最后由 wawxdyy 于 2007-7-20 13:13 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2007-07-20 14:38 |只看该作者
多谢 jamesr 的解决办法!也谢谢各位的帮助!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP