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