?

Log in

No account? Create an account

Abstract socket как гарант уникальности процесса - Узором созвездий по мантии ночи

15.01.2016, Пятница

14:48:00 - Abstract socket как гарант уникальности процесса

Previous Entry Поделиться Next Entry

А кто что скажет про такой способ недопущения запуска второго экземпляра процесса? (При условии, что у меня нет потребности извне узнавать PID уже запущенного экземпляра.)

import socket
import sys
import time

def get_lock(process_name):
    global lock_socket   # Without this our lock gets garbage collected
    lock_socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
    try:
        lock_socket.bind('\0' + process_name)
        print 'I got the lock'
    except socket.error:
        print 'lock exists'
        sys.exit()

get_lock('running_test')
while True:
    time.sleep(3)

О том, что это Linux specific, я уже прочитал.

This entry was originally posted at http://arilou.dreamwidth.org/980028.html. Please comment there using OpenID.

Comments:

[User Picture]
From:vitus_wagner
Date:15.01.2016 12:07:45
(Link)
Как-то оно слишком извратно.
Если уж ты все равно можешь позволить себе путь в файловой системе,
то почему бы не использовать fcntl.flock? Будет явно более переносимо.
Кстати, можешь сэкономить путь, делая flock на sys.argv[0].
(Ответить) (Thread)
[User Picture]
From:arilou
Date:15.01.2016 12:21:22
(Link)
"Абстрактные" сокеты не требуют же пути в файловой системе.
(Ответить) (Parent) (Thread)
[User Picture]
From:vitus_wagner
Date:15.01.2016 21:02:52
(Link)
Зато - непереносимы.
(Ответить) (Parent) (Thread)
[User Picture]
From:phd
Date:15.01.2016 12:43:38

Use locking, Luke!

(Link)
Вот такую программу запусти одновременно в двух терминалах:
#! /usr/bin/env python

import sys
from time import sleep
from fcntl import flock, LOCK_EX, LOCK_UN, LOCK_NB

lock_file = open(sys.argv[0], 'r')
try:
   flock(lock_file , LOCK_EX|LOCK_NB)
except IOError: # locked
   lock_file.close()
   sys.exit()

sleep(5)
flock(lock_file , LOCK_UN)
lock_file.close()


Edited at 2016-01-15 12:52 (UTC)
(Ответить) (Thread)
[User Picture]
From:arilou
Date:19.01.2016 11:46:26

Re: Use locking, Luke!

(Link)
Думал было, что залочка помешает мне перезаписать файл программы, не остановив текущий процесс. Но нет, не мешает.
Мешает, правда, запустить несколько копий с разными настройками (с локом по сокету я могу прописывать в конфиге разные имена сокета). Да, это уже несовсем "строго один процесс на систему", это скорее "если хочешь второй процесс -- явно укажи, что понимаешь, что делаешь".
(Ответить) (Parent) (Thread)
[User Picture]
From:beldmit
Date:15.01.2016 14:14:24
(Link)
Я не питонист, а не-запуск двух копий процесса одновременно делаю flock-ом. Удалось залочить файл - ок, едем дальше. Нет - курим бамбук.Процесс при этом пускается из крона.

У Яндекса была какая-то (перловая же) приблуда для такого интеллектуального режима, но как её зовут, я забыл.
(Ответить) (Thread)