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

2015-05-15 11:56:28 +08:00
 love
在linux和windows上有通用的方法吗?

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

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

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

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

@Septembers 能说一下这个do_magic用了什么魔法吗
mahone3297
2015-05-15 13:03:55 +08:00
@love 说了,判断条件是canLock,不是isFileExists.....
SoloCompany
2015-05-15 13:11:01 +08:00
加个守护进程(bootloader)干这事
sujin190
2015-05-15 13:28:58 +08:00
是不是可以bind个端口

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

https://www.v2ex.com/t/191267

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

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

© 2021 V2EX