Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
eloah
V2EX  ›  Linux

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

  •  
  •   eloah · Oct 31, 2016 · 5928 views
    This topic created in 3655 days ago, the information mentioned may be changed or developed.

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

    python a.py
    

    将其运行.

    那么,如何使我再次调用

    python a.py
    

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

    23 replies  •  2016-11-05 02:12:23 +08:00
    knightdf
    knightdf
    Oct 31, 2016❤️1
    1
    1,写 pid
    2,检查进程
    firebroo
    firebroo
    Oct 31, 2016 via Android❤️1
    2
    pid
    mooncakejs
    mooncakejs
    Oct 31, 2016❤️1
    3
    在 /tmp 目录下 创建一个独占文件,不能独占就说明有实例存在
    tt0411
    tt0411
    Oct 31, 2016❤️1
    4
    独占一个端口
    LazyZhu
    LazyZhu
    Oct 31, 2016❤️1
    5
    Linux 一般用 /run/lock or /var/run 等目录的 .lock 来管理。
    eslizn
    eslizn
    Oct 31, 2016❤️1
    6
    进程互斥锁
    tabris17
    tabris17
    Oct 31, 2016❤️1
    7
    CreateMutex
    dearmymy
    dearmymy
    Oct 31, 2016❤️1
    8
    1,findwindow
    2,互斥锁
    Clarencep
    Clarencep
    Oct 31, 2016❤️1
    9
    文件锁+1

    文件锁比较通用。
    paw
    paw
    Oct 31, 2016❤️1
    10
    命名管道也行,检查管道存在,而且还可以用来传送新启动进程的参数
    lxm
    lxm
    Oct 31, 2016❤️1
    11
    flock
    chenzhiwei
    chenzhiwei
    Oct 31, 2016 via Android❤️1
    12
    可以用 dbus API ,类似这样的:
    dbus.SessionBus().request_name(xxx)

    每次启动都先检查这个东西
    TaMud
    TaMud
    Oct 31, 2016❤️2
    13
    pid 写入文件
    启动检测文件里的 pid 是否在运行,是否同一个程序名称
    wshn13
    wshn13
    Oct 31, 2016
    15
    @chenzhiwei 对 我们就是这样做过
    likuku
    likuku
    Oct 31, 2016
    16
    简单的,可以先运行个系统的 ps 配合 awk,grep,wc 统计当前系统有多少个同名进程,大于 1 即 执行 sys.exit()
    lijianying10
    lijianying10
    Oct 31, 2016❤️1
    17
    为什么不写成服务呢? 比如说用 systemd 或者 supervisor 托管起来。这样就可以在主机内可限定进程数量的运行了。还不用改你的脚本。
    a86913179
    a86913179
    Oct 31, 2016❤️1
    18
    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
    jimzhong
    Oct 31, 2016❤️1
    19
    在 Linux 下可以用文件锁
    clino
    clino
    Oct 31, 2016 via Android❤️1
    20
    还有个方法是监听某个固定端口
    eloah
    eloah
    OP
    Oct 31, 2016 via Android
    21
    非常感谢各位~
    xshwy
    xshwy
    Nov 5, 2016
    22
    from python_pid import PidFile

    # 没有文件的话,会自动创建,文件名可以随意,不用后缀也可以
    file = PidFile('/var/tmp/balabala.lock')

    # 如果文件没有被加锁,会加锁成功;
    # 如果文件已经被加锁,会抛出异常,如果不做处理将会自动退出,可以达到只存在一个实例的要求
    # 异常内容是: Process id 14336 Already running , pid to balabala
    file.acquire()
    xshwy
    xshwy
    Nov 5, 2016
    23
    22L 内容 在 Python3 测试成功, py2 没试过。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5287 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 01:27 · PVG 09:27 · LAX 17:27 · JFK 20:27
    ♥ Do have faith in what you're doing.