写了一个脚本,想挂后台运行,又想避免重复运行,需要检测后台是否有已经运行的脚本。实现目标:python脚本只运行一次,第二次运行时直接退出。
在linux上比较合适的做法是创建一个systemd控制的service,有时候就临时用一用,还有考虑跨设备运行的时候也有点麻烦。
找了两个比较简单的方案。
1. 使用tendo
import tendo.singleton
single = tendo.singleton.SingleInstance()
# 测试代码
import time
while(True):
print("test")
time.sleep(2)
2. 使用pidfile
from pid import PidFile
# 会对with中的代码块加锁
with PidFile():
import time
while(True):
print("test")
time.sleep(2)
或者
from pid.decorator import pidfile
@pidfile
def main():
# 被pidfile标签装饰的函数只能运行一次
# running code
基本原理
最常见的基本操作都差不多,在运行到需要只能执行一次的代码时,在某个路径下创建一个pidfile的文件,第二次执行时如果检测到路径下有pidfile就报错跳过执行。代码执行完成后删除pidfile。
为了避免pidfile在某些特殊情况下退出未执行,通过atexit等库处理退出时的情况。
类似的做法还有创建一个linux的socket,退出时删除。以及基于ps等linux脚本命令查看运行的进程名。
参考链接
https://*.com/questions/788411/check-to-see-if-python-script-is-running/7758075#7758075
https://pythonhosted.org/tendo/