LINUX.ORG.RU

Какой самый некостыльный способ ограничить количество инстансов приложений в Java

 


0

1

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

★★★★★

Последнее исправление: f1xmAn (всего исправлений: 1)

Ответ на: комментарий от hippi90

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

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

Присоединяюсь. Вот и все обсуждение.

anonymous
()

Самый элементарный - файл с pid внутрях. Хотя я видел вариант, когда при старте открывался сокет на определенном порту. Соотв. второй процесс по эксепшену просто вываливался.

Nagwal ★★★★
()
Последнее исправление: Nagwal (всего исправлений: 1)

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

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

С одной стороны оверкилл, с другой - нет проблем с тем, что файл не вытирается при непредвиденной остановке jvm. По kill -9 или oom.

Nagwal ★★★★
()

pid нельзя использовать - это ненадёжно (as in не запускаемся потому что есть совершенно левый процесс с таким pid).

Самый очевидный способ - это лочить файл через flock(2) c LOCK_EX|LOCK_NB - второй процесс который захочет захватить файл получит EWOULDBLOCK, а при завершении процесса захватившего блокировку, включая падение, оная будет автоматически освобождёна. Другой вариант - семафоры (POSIX, SysV), но надо внимательно прочитать об особенностях их поведения.

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

Ну, я там уже выше отвечал, что с одной стороны конечно оверкилл, а с другой 1) кроссплатформенно 2) нет неясности, с неудаленным файлом (kill -9, oom)

Ну и обычно все равно наружу торчат какие то порты, веб, jmx etc. Можно их проверять.

Nagwal ★★★★
()

Отдал бы эту задачу на откуп инит-у, а он уж пусть как умеет так и выкручивается.

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

лочить файл через flock(2) c LOCK_EX|LOCK_NB

Плюсую. Только один минус: шибко умный юзер может удалить файл и тем самым позволить запустить ещё один процесс. Хотя это можно объявить фичей.

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

Бред какой. «Шибко умный юзер» может обойти абсолютно любой механизм блокировки запуска нескольких копий процесса. И пусть обходит если ему приспичило, цель механизма совершенно другая.

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