1
mahone3297 May 15, 2015
》在linux上,一般都是用个lock文件来作锁,只是这种方式也有缺点,比如程序崩溃后文件没删除需要手工处理。
好像不需要手工删除吧。。。是lock文件,不是判断文件是否存在。。。 |
2
jun4rui May 15, 2015
自己可以写一个lock文件呗,然后每次启动看看内心里面还不是已经有一个在跑了,有就退出,没有就删掉lock。
|
3
Septembers May 15, 2015 吧PID写入lock里
- 如果lock的PID对应进程存在 退出 - 如果lock的PID对应进程不存在 更新PID 如果正常运行 符合第一条 - 退出 如果崩溃再启动 符合第二条 - 更新PID,继续运行就可以了 |
4
noahzh May 15, 2015
pid 文件就是做这件事情的。。。。
|
5
love OP @mahone3297 比如说,进程起来了,发现没lock文件,就建了一个,后来程序崩溃掉了,留下一个lock文件。重启程序时发现有lock了文件了,实际没有程序在运行,这时需要手工删除这个lock文件。
|
6
haitongz May 15, 2015
|
7
love OP @Septembers PID是个方法,但不是完美的,因为PID会重复,总数到3万多时就重用之前的了,如果程序崩溃了,另一个程序又用到了这个pid,然后就有问题了。当然这个机会不大,但总是一个隐患。
|
9
kunimi May 15, 2015
<script src="https://gist.github.com/kunimi/8afd48b33e7a2b6f0fd0.js"></script>
|
10
Septembers May 15, 2015
|
11
Septembers May 15, 2015
@kunimi 你那是对象单例
|
12
ngloom May 15, 2015
偷个懒,监听一个sock端口?
|
13
kunimi May 15, 2015
@Septembers oh,看错了~
|
14
billlee May 15, 2015
在 Linux 上,正确的 lock 文件使用方法是打开 lock 文件后,用 fcntl 加锁。不是去判断文件是否存在。
|
15
zaxaca May 15, 2015
singleton
|
16
likuku May 15, 2015
Linux 上,可以查询当前进程里同文件名(py名字)进程数,
或者直接调用shell执行ps grep wc -l 统计当前有几个进程运行,然后判断是否执行/终止 当前进程。 |
17
kcworms May 15, 2015
socket法可用,不listen的话,就算绑到gethostname()上也不会触发Windows 7的自带防火墙。或者监听localhost也行(没必要)。
@Septembers 能说一下这个do_magic用了什么魔法吗 |
18
mahone3297 May 15, 2015
@love 说了,判断条件是canLock,不是isFileExists.....
|
19
SoloCompany May 15, 2015 via Android
加个守护进程(bootloader)干这事
|
20
sujin190 May 15, 2015
是不是可以bind个端口
|
21
ksc010 May 15, 2015
我现在用的是pid文件吧 进程id写道文件里面
|
22
lilydjwg May 15, 2015 我有现成的代码,适用于类 UNIX 系统,Windows 不知道: https://github.com/lilydjwg/winterpy/blob/master/pylib/pidfile.py
用的是写有 pid 的锁文件。当然更好的办法是使用 flock。@billlee: fcntl 的锁(旧锁,不是 Linux 新加的那个)在多线程情况下会出问题的。而且我在 FreeBSD 上试过,得到了非预期的结果。 监听套接字也是个不错的主意,还可以在这个套接字上搞搞 RPC 什么的 :-) |
23
lazywen May 15, 2015
pid + 判断这个pid的进程、运行参数,我之前是这样搞的
|
24
wibile May 15, 2015
既然有一个进程在运行,为什么还要启动第二个?我遇到的情况都是用supervisord启动程序,程序退出自动重启。
|
25
juntao May 15, 2015
|
26
tabris17 May 15, 2015
windows下貌似不支持fcntl
|
27
wyxfcy May 15, 2015 @lilydjwg FreeBSD/Mac 下用 OPEN 调用加创建和加锁参数,是一个原子操作。 Linux下不支持,只能先OPEN 再 LOCK,不是原子操作。
|
30
Cynic222 May 15, 2015
|