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] psilogic.livejournal.com 2015-08-17 05:43 pm (UTC)(link)
что есть пидфайл и как он спасет аццов демократии?

[identity profile] theiced.livejournal.com 2015-08-17 05:48 pm (UTC)(link)
flock + записать пид залочившего в файл. при попытке нового запуска кроме самого пидфайла проверять ещё есть ли такой процесс. можно ещё ему сигналов послать на предмет жив ли он, всё вот это.

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

[identity profile] psilogic.livejournal.com 2015-08-17 05:56 pm (UTC)(link)
послать сигнал на предмет сдох ли он - вот эта вот идея выглядит очень антересно
а не подскажет ли уважаемый дон, который из сигналов считается "кошерным" для этой цели?
SIGUSR1 с предварительным signal(SIGUSR1, SIG_IGN)?

что я хочу - защиту от одновременного запуска двух instance, которая не требует танцев с бубном, если прога йопнулась или была йопнута через kill -9
Edited 2015-08-17 17:58 (UTC)

[identity profile] theiced.livejournal.com 2015-08-17 06:03 pm (UTC)(link)
я ж не линуксоид, откуда я помню как это говно внутре в деталях :)

[identity profile] psilogic.livejournal.com 2015-08-17 06:06 pm (UTC)(link)
ааа...
ну все равно хоть какой-то выход, спасибо! :)

[identity profile] afa-at-work.livejournal.com 2015-08-17 10:24 pm (UTC)(link)
ххе
"а руки то помнят!"