技术解析

如何确保系统中某个程序只存在一个实例
0
2021-07-01 12:18:29
idczone

比如,我现在有 a.py 这个文件,会持续的运行. 我使用

python a.py

将其运行.

那么,如何使我再次调用

python a.py

的时候,提示程序已经在运行,并直接退出呢?


1,写 pid
2,检查进程

pid

在 /tmp 目录下 创建一个独占文件,不能独占就说明有实例存在

独占一个端口

Linux 一般用 /run/lock or /var/run 等目录的 .lock 来管理。

进程互斥锁

CreateMutex

1,findwindow
2,互斥锁

文件锁+1
文件锁比较通用。

命名管道也行,检查管道存在,而且还可以用来传送新启动进程的参数

flock

可以用 dbus API ,类似这样的:
dbus.SessionBus().request_name(xxx)
每次启动都先检查这个东西

pid 写入文件
启动检测文件里的 pid 是否在运行,是否同一个程序名称

一般是用 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

对 我们就是这样做过

简单的,可以先运行个系统的 ps 配合 awk,grep,wc 统计当前系统有多少个同名进程,大于 1 即 执行 sys.exit()

为什么不写成服务呢? 比如说用 systemd 或者 supervisor 托管起来。这样就可以在主机内可限定进程数量的运行了。还不用改你的脚本。

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

在 Linux 下可以用文件锁

还有个方法是监听某个固定端口

非常感谢各位~

from python_pid import PidFile
没有文件的话,会自动创建,文件名可以随意,不用后缀也可以
file = PidFile('/var/tmp/balabala.lock')
如果文件没有被加锁,会加锁成功;
如果文件已经被加锁,会抛出异常,如果不做处理将会自动退出,可以达到只存在一个实例的要求
异常内容是: Process id 14336 Already running , pid to balabala
file.acquire()

22L 内容 在 Python3 测试成功, py2 没试过。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服