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 06:55 pm (UTC)(link)
unix socket?

[identity profile] psilogic.livejournal.com 2015-08-17 08:18 pm (UTC)(link)
Разве что в никсах существуют именованные сокеты, иначе придется занимать "well-known" порт, который может внезапно оказаться занят кем-то еще. А то и несколько сокетов, если я хочу иметь представление о состоянии нескольких "наших" процессов. Пока лучшей выглядит идея с созданием файла на старте, удалением на выходе и дополнительной проверкой через посылку signal-а, чтобы исключить краш/килл.

[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)
Ну я и говорю: это давно придумали, слишком давно. Но никому особенно не мешает до сих пор. Код на этом уровне пишется один раз, или даже не пишется. Какая разница: инопланетный-планетный, работает и хана.

[identity profile] ujo.livejournal.com 2015-08-18 04:01 am (UTC)(link)

Она видимо и есть лучшая, потому что традиционно её используют. Но вот процесс по пид файлу с PID лучше проверять по наличию в таблице процессов и сверять, тот ли это процесс, номер и заместить могут.

[identity profile] psilogic.livejournal.com 2015-08-18 08:14 am (UTC)(link)
Это мудрая мысль, тогда вопрос: это надо вывод [ ps -a ] парсить или есть более гуманный путь?

[identity profile] ujo.livejournal.com 2015-08-18 10:03 am (UTC)(link)

Если "везде" касалось только линуксов, тогда проверять /proc/pidnumber/args и /proc/pidnumber/exe

[identity profile] theiced.livejournal.com 2015-08-18 01:59 pm (UTC)(link)
пока очередной поттеринг там что нибудь не сломает, ага.

[identity profile] ujo.livejournal.com 2015-08-18 05:27 pm (UTC)(link)

Сильно у вас бомбит. Впрочем, сочувствую опыту работы с только одной системой.

[identity profile] theiced.livejournal.com 2015-08-18 10:11 pm (UTC)(link)
с какой одной? малыш, ты там часом не попутал?