
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 吧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 我有现成的代码,适用于类 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 |
27 wyxfcy 2015-05-15 16:57:00 +08:00 @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 |