V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
eloah
V2EX  ›  Linux

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

  •  
  •   eloah · 2016-10-31 11:02:29 +08:00 · 4549 次点击
    这是一个创建于 2975 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    python a.py
    

    将其运行.

    那么,如何使我再次调用

    python a.py
    

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

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

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

    每次启动都先检查这个东西
    TaMud
        13
    TaMud  
       2016-10-31 15:58:26 +08:00   ❤️ 2
    pid 写入文件
    启动检测文件里的 pid 是否在运行,是否同一个程序名称
    wshn13
        15
    wshn13  
       2016-10-31 18:22:20 +08:00
    @chenzhiwei 对 我们就是这样做过
    likuku
        16
    likuku  
       2016-10-31 18:26:41 +08:00
    简单的,可以先运行个系统的 ps 配合 awk,grep,wc 统计当前系统有多少个同名进程,大于 1 即 执行 sys.exit()
    lijianying10
        17
    lijianying10  
       2016-10-31 18:38:40 +08:00   ❤️ 1
    为什么不写成服务呢? 比如说用 systemd 或者 supervisor 托管起来。这样就可以在主机内可限定进程数量的运行了。还不用改你的脚本。
    a86913179
        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
    jimzhong
        19
    jimzhong  
       2016-10-31 19:04:03 +08:00   ❤️ 1
    在 Linux 下可以用文件锁
    clino
        20
    clino  
       2016-10-31 19:46:04 +08:00 via Android   ❤️ 1
    还有个方法是监听某个固定端口
    eloah
        21
    eloah  
    OP
       2016-10-31 23:29:50 +08:00 via Android
    非常感谢各位~
    xshwy
        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()
    xshwy
        23
    xshwy  
       2016-11-05 02:12:23 +08:00
    22L 内容 在 Python3 测试成功, py2 没试过。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5367 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 08:04 · PVG 16:04 · LAX 00:04 · JFK 03:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.