如何确保系统中某个程序只存在一个实例

2016-10-31 11:02:29 +08:00
 eloah

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

python a.py

将其运行.

那么,如何使我再次调用

python a.py

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

4380 次点击
所在节点    Linux
23 条回复
knightdf
2016-10-31 11:06:27 +08:00
1,写 pid
2,检查进程
firebroo
2016-10-31 11:21:40 +08:00
pid
mooncakejs
2016-10-31 11:25:19 +08:00
在 /tmp 目录下 创建一个独占文件,不能独占就说明有实例存在
tt0411
2016-10-31 11:33:13 +08:00
独占一个端口
LazyZhu
2016-10-31 11:36:24 +08:00
Linux 一般用 /run/lock or /var/run 等目录的 .lock 来管理。
eslizn
2016-10-31 11:43:19 +08:00
进程互斥锁
tabris17
2016-10-31 11:44:25 +08:00
CreateMutex
dearmymy
2016-10-31 11:45:58 +08:00
1,findwindow
2,互斥锁
Clarencep
2016-10-31 12:14:18 +08:00
文件锁+1

文件锁比较通用。
paw
2016-10-31 13:01:32 +08:00
命名管道也行,检查管道存在,而且还可以用来传送新启动进程的参数
lxm
2016-10-31 15:44:54 +08:00
flock
chenzhiwei
2016-10-31 15:58:11 +08:00
可以用 dbus API ,类似这样的:
dbus.SessionBus().request_name(xxx)

每次启动都先检查这个东西
TaMud
2016-10-31 15:58:26 +08:00
pid 写入文件
启动检测文件里的 pid 是否在运行,是否同一个程序名称
windydays
2016-10-31 18:10:20 +08:00
wshn13
2016-10-31 18:22:20 +08:00
@chenzhiwei 对 我们就是这样做过
likuku
2016-10-31 18:26:41 +08:00
简单的,可以先运行个系统的 ps 配合 awk,grep,wc 统计当前系统有多少个同名进程,大于 1 即 执行 sys.exit()
lijianying10
2016-10-31 18:38:40 +08:00
为什么不写成服务呢? 比如说用 systemd 或者 supervisor 托管起来。这样就可以在主机内可限定进程数量的运行了。还不用改你的脚本。
a86913179
2016-10-31 18:48:49 +08:00
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
jimzhong
2016-10-31 19:04:03 +08:00
在 Linux 下可以用文件锁
clino
2016-10-31 19:46:04 +08:00
还有个方法是监听某个固定端口

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/316723

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX