LINUX.ORG.RU

[python]Блокировка повторного запуска/Аналог ps


0

0

Собственно, как кошерно осуществить блокировку запуска второго экземпяра приложения?Сейчас делается через временный файл - но это не комильфо, при нештатном завершении файл остаётся.

Записывать туда pid - тоже не выход, ведь теоретически может какой другой процесс с таким pid появиться.

Лучше всего проверять наличие непосредственно процесса - но через os.system и ps как-то некрасиво.Есть ли какой модуль (штатный!Дополнительные велосипеды типа procpy не предлагать.) в питоне, чтоб проверять запущенные в нём процессы?

★★

файл можено не просто создать а открыть и не закрывать до выхода, а при старте пытаться его удалить если он есть, если не получится то выход ,а если получится то создаем новый и продолжаем как обычно.

olegsov ()

>Записывать туда pid - тоже не выход, ведь теоретически может какой другой процесс с таким pid появиться.

создавать в /var/lock/user или где еще

programname с пидом внтури.

при запуске программы, если найден файл блокировки, проверять есть ли действительно в списке процессов натой номер и какого имя программы, работающей под этим номером. При отсутвии - сносить файл блокировки. Дешево и сердито. Метод используется повсеместно.

dikiy ★★☆☆☆ ()
Ответ на: комментарий от olegsov

>файл можено не просто создать а открыть и не закрывать до выхода, а при старте пытаться его удалить если он есть, если не получится то выход ,а если получится то создаем новый и продолжаем как обычно.

бугага. Это тебе не винда. Файл можно удалить всегда, независимо от того, открыт он или закрыт.

dikiy ★★☆☆☆ ()
Ответ на: комментарий от dikiy

проверять есть ли действительно в списке процессов натой номер и какого имя программы, работающей под этим номером

Дык, а проверять-то чем?Всё равно ps, получается.

Вобщем, всё ясно.Пусть будет через os

checkproc = os.popen('ps aux|grep %s' % __file__).read()

if checkproc.count('python') > 1:
	os._exit(1)

nitz ★★ ()
Ответ на: комментарий от nitz

он не только пиды выдает, он и код возврата ставит - нашел/не нашел. А -f ищет по всей командной строке. Хотя может я не правильно понял мысль.

P.S. Вот здесь обсуждают подобное - http://www.gossamer-threads.com/lists/python/dev/679522, там есть ссылка на рецепт с лок-файлами.

vga ★★ ()

Сейчас делается через временный файл - но это не комильфо, при нештатном завершении файл остаётся.

Это комильфо, если использовать flock.

Лучше всего проверять наличие непосредственно процесса - но через os.system и ps как-то некрасиво.Есть ли какой модуль (штатный!Дополнительные велосипеды типа procpy не предлагать.) в питоне, чтоб проверять запущенные в нём процессы?

Можно смотреть процессы прямо в /proc (на Linux'е), но твою задачу таким способом не решить без race condition'ов.

Deleted ()
Ответ на: комментарий от olegsov

файл можено не просто создать а открыть и не закрывать до выхода, а при старте пытаться его удалить если он есть, если не получится то выход ,а если получится то создаем новый и продолжаем как обычно.

Открытый файл можно удалить.

Deleted ()
Ответ на: комментарий от dikiy

при запуске программы, если найден файл блокировки, проверять есть ли действительно в списке процессов натой номер и какого имя программы, работающей под этим номером. При отсутвии - сносить файл блокировки. Дешево и сердито. Метод используется повсеместно.

Без flock лучше этого не делать.

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.