1
knightdf 2016-10-31 11:06:27 +08:00 1
1,写 pid
2,检查进程 |
2
firebroo 2016-10-31 11:21:40 +08:00 via Android 1
pid
|
3
mooncakejs 2016-10-31 11:25:19 +08:00 1
在 /tmp 目录下 创建一个独占文件,不能独占就说明有实例存在
|
4
tt0411 2016-10-31 11:33:13 +08:00 1
独占一个端口
|
5
LazyZhu 2016-10-31 11:36:24 +08:00 1
Linux 一般用 /run/lock or /var/run 等目录的 .lock 来管理。
|
6
eslizn 2016-10-31 11:43:19 +08:00 1
进程互斥锁
|
7
tabris17 2016-10-31 11:44:25 +08:00 1
CreateMutex
|
8
dearmymy 2016-10-31 11:45:58 +08:00 1
1,findwindow
2,互斥锁 |
9
Clarencep 2016-10-31 12:14:18 +08:00 1
文件锁+1
文件锁比较通用。 |
10
paw 2016-10-31 13:01:32 +08:00 1
命名管道也行,检查管道存在,而且还可以用来传送新启动进程的参数
|
11
lxm 2016-10-31 15:44:54 +08:00 1
flock
|
12
chenzhiwei 2016-10-31 15:58:11 +08:00 via Android 1
可以用 dbus API ,类似这样的:
dbus.SessionBus().request_name(xxx) 每次启动都先检查这个东西 |
13
TaMud 2016-10-31 15:58:26 +08:00 2
pid 写入文件
启动检测文件里的 pid 是否在运行,是否同一个程序名称 |
14
windydays 2016-10-31 18:10:20 +08:00 2
一般是用 flock(), O_CREAT|O_RDWR 打开一个文件,然后 flock( LOCK_EX|LOCK_NB )
http://stackoverflow.com/questions/2964391/preventing-multiple-process-instances-on-linux http://stackoverflow.com/questions/5339200/how-to-create-a-single-instance-application-in-c-or-c https://github.com/qtproject/qt-solutions/tree/master/qtsingleapplication/src |
15
wshn13 2016-10-31 18:22:20 +08:00
@chenzhiwei 对 我们就是这样做过
|
16
likuku 2016-10-31 18:26:41 +08:00
简单的,可以先运行个系统的 ps 配合 awk,grep,wc 统计当前系统有多少个同名进程,大于 1 即 执行 sys.exit()
|
17
lijianying10 2016-10-31 18:38:40 +08:00 1
为什么不写成服务呢? 比如说用 systemd 或者 supervisor 托管起来。这样就可以在主机内可限定进程数量的运行了。还不用改你的脚本。
|
18
a86913179 2016-10-31 18:48:49 +08:00 1
lockfile=/var/tmp/mylock
if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null; then trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT # do stuff here # clean up after yourself, and release your trap rm -f "$lockfile" trap - INT TERM EXIT else echo "Lock Exists: $lockfile owned by $(cat $lockfile)" fi |
19
jimzhong 2016-10-31 19:04:03 +08:00 1
在 Linux 下可以用文件锁
|
20
clino 2016-10-31 19:46:04 +08:00 via Android 1
还有个方法是监听某个固定端口
|
21
eloah OP 非常感谢各位~
|
22
xshwy 2016-11-05 02:08:46 +08:00
from python_pid import PidFile
# 没有文件的话,会自动创建,文件名可以随意,不用后缀也可以 file = PidFile('/var/tmp/balabala.lock') # 如果文件没有被加锁,会加锁成功; # 如果文件已经被加锁,会抛出异常,如果不做处理将会自动退出,可以达到只存在一个实例的要求 # 异常内容是: Process id 14336 Already running , pid to balabala file.acquire() |
23
xshwy 2016-11-05 02:12:23 +08:00
22L 内容 在 Python3 测试成功, py2 没试过。
|