python 程序怎么能保证只运行一个实例?第二个实例起来时发现有现有进程自动退出?

2015 年 5 月 15 日
 love
在linux和windows上有通用的方法吗?

在linux上,一般都是用个lock文件来作锁,只是这种方式也有缺点,比如程序崩溃后文件没删除需要手工处理。

PS. 以前学Windows C语言编程时Windows提供系统级锁对象,只是这是在python不好应用。
11224 次点击
所在节点    Python
31 条回复
mahone3297
2015 年 5 月 15 日
》在linux上,一般都是用个lock文件来作锁,只是这种方式也有缺点,比如程序崩溃后文件没删除需要手工处理。
好像不需要手工删除吧。。。是lock文件,不是判断文件是否存在。。。
jun4rui
2015 年 5 月 15 日
自己可以写一个lock文件呗,然后每次启动看看内心里面还不是已经有一个在跑了,有就退出,没有就删掉lock。
Septembers
2015 年 5 月 15 日
吧PID写入lock里
- 如果lock的PID对应进程存在 退出
- 如果lock的PID对应进程不存在 更新PID

如果正常运行  符合第一条 - 退出
如果崩溃再启动 符合第二条 - 更新PID,继续运行就可以了
noahzh
2015 年 5 月 15 日
pid 文件就是做这件事情的。。。。
love
2015 年 5 月 15 日
@mahone3297 比如说,进程起来了,发现没lock文件,就建了一个,后来程序崩溃掉了,留下一个lock文件。重启程序时发现有lock了文件了,实际没有程序在运行,这时需要手工删除这个lock文件。
haitongz
2015 年 5 月 15 日
love
2015 年 5 月 15 日
@Septembers PID是个方法,但不是完美的,因为PID会重复,总数到3万多时就重用之前的了,如果程序崩溃了,另一个程序又用到了这个pid,然后就有问题了。当然这个机会不大,但总是一个隐患。
love
2015 年 5 月 15 日
@haitongz socket大法会在windows上触发防火墙对话框。
kunimi
2015 年 5 月 15 日
Septembers
2015 年 5 月 15 日
Septembers
2015 年 5 月 15 日
@kunimi 你那是对象单例
ngloom
2015 年 5 月 15 日
偷个懒,监听一个sock端口?
kunimi
2015 年 5 月 15 日
@Septembers oh,看错了~
billlee
2015 年 5 月 15 日
在 Linux 上,正确的 lock 文件使用方法是打开 lock 文件后,用 fcntl 加锁。不是去判断文件是否存在。
zaxaca
2015 年 5 月 15 日
singleton
likuku
2015 年 5 月 15 日
Linux 上,可以查询当前进程里同文件名(py名字)进程数,

或者直接调用shell执行ps grep wc -l 统计当前有几个进程运行,然后判断是否执行/终止 当前进程。
kcworms
2015 年 5 月 15 日
socket法可用,不listen的话,就算绑到gethostname()上也不会触发Windows 7的自带防火墙。或者监听localhost也行(没必要)。

@Septembers 能说一下这个do_magic用了什么魔法吗
mahone3297
2015 年 5 月 15 日
@love 说了,判断条件是canLock,不是isFileExists.....
SoloCompany
2015 年 5 月 15 日
加个守护进程(bootloader)干这事
sujin190
2015 年 5 月 15 日
是不是可以bind个端口

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/191267

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX