如何确保系统中某个程序只存在一个实例 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
eloah
V2EX    Linux

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

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

    比如,我现在有 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     Solana     5349 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 01:18 PVG 09:18 LAX 18:18 JFK 21:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86