psilogic: (wpriz)
psilogic ([personal profile] psilogic) wrote2015-08-17 08:36 pm

Послание линуксоидам

А вот просветите прожженного вындузоида насчет одной вещи.

Есть ли в линухе хоть какой-нибудь ресурс, который саморазлочивается при грубом убийстве программы? Хочется сделать защиту от одновременного запуска двух instance. Перепробовал уже open(O_EXCL), flock, lockf, shm_open(O_EXCL), sem_open(O_EXCL), sem_trywait - всё либо жидко срёт на локи, либо виснет (lockf(...F_TEST...)), так как, видите ли, файловая система недоразвитая (nfs), либо в случае убиения через kill -9 оставляет ресурс в состоянии, неотличимом от залоченного.

Щито делать? Неужели уних в этом отношении дохлее выньды?

З.Ы. Есть, конечно, сокеты, но это значит юзать "магический номер" порта, что, мягко гойворя, не приветствуется корпоративными традициями кодопейсательства...

З.Ы.Ы. Спасибо всем за мозговой штурм, в конце-концов все заработало по принципу:
1) проверяем, есть ли нужный файл /tmp/чтототам.pid, читаем оттуда pid
2) если есть - проверяем запущен ли такой процесс через signal(pid, 0)
3) если запущен - дополнительно проверяем через readlink(..."/proc/<pid>/exe"...), что этот процесс имеет то же имя, что и текущий

З.Ы.Ы.Ы причины, почему блокируется lockf(...F_TEST...) и flock(...|LOCK_NB...) так и остались невыясненными: блокируется оно даже и не на nfs

[identity profile] afa-at-work.livejournal.com 2015-08-17 10:31 pm (UTC)(link)
unix socket и есть именованный сокет. ограничение - работает в рамках хоста. ну как пидфайл. является этаким проколом реальности в сокетах. закрываются при краше. но вот применять как мутекс - неверно наверн. пидфайл, с чтением что там есть, по этому пиду, и проверкой на себя наверн лучше. библиотек для - наделано немеряно, в каждом скриптовом языке аналог можно найти.

[identity profile] psilogic.livejournal.com 2015-08-17 10:37 pm (UTC)(link)
А, вот оно что - unix socket ≠ socket in unix :) Учитывая, что интерфейс к сокетам сам по себе довольно инопланетный, наверное, через pid и впрямь дешевле будет.

[identity profile] afa-at-work.livejournal.com 2015-08-17 10:47 pm (UTC)(link)
ну да. заодно и аккуратно грохнуть из скрипта можно будет

[identity profile] russhatter.livejournal.com 2015-08-18 09:32 am (UTC)(link)
Не очень понятно, почему он "инопланетный". Он просто с древних времён остался, и, поскольку оказался достаточно хорошим, его и не причёсывали с тех времён. Как раз очень хорошая рекомендация. Всем хватает - Вам нет.
Открыть именованный сокет - самое правильное решение. А писать код с нуля - вовсе не обязательно. Простенький код для сервера доступен в более или любом фреймворке.

[identity profile] psilogic.livejournal.com 2015-08-18 09:43 am (UTC)(link)
Инопланетный потому, что больше нигде вы не найдете последовательностей инициализации типа socket->bind->listen->accept

[identity profile] russhatter.livejournal.com 2015-08-18 10:11 am (UTC)(link)
Ну я и говорю: это давно придумали, слишком давно. Но никому особенно не мешает до сих пор. Код на этом уровне пишется один раз, или даже не пишется. Какая разница: инопланетный-планетный, работает и хана.