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] ujo.livejournal.com 2015-08-17 06:53 pm (UTC)(link)
Дык как все

http://stackoverflow.com/questions/5339200/how-to-create-a-single-instance-application-in-c-or-c

#include <sys/file.h>
#include <errno.h>

int pid_file = open("/var/run/whatever.pid", O_CREAT | O_RDWR, 0666);
int rc = flock(pid_file, LOCK_EX | LOCK_NB);
if(rc) {
if(EWOULDBLOCK == errno)
; // another instance is running
}
else {
// this is the first instance
}
Edited 2015-08-17 18:54 (UTC)

[identity profile] theiced.livejournal.com 2015-08-17 06:55 pm (UTC)(link)
просто flock очевидно не работает. потому что.

[identity profile] ujo.livejournal.com 2015-08-17 06:56 pm (UTC)(link)
На NFS это всё плохо совсем будет, да - но вообще это считается вроде как достаточным методом.

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

[identity profile] psilogic.livejournal.com 2015-08-17 08:14 pm (UTC)(link)
это ты про nfs, про alt-linux или про оба? :)))

[identity profile] theiced.livejournal.com 2015-08-18 07:32 am (UTC)(link)
про линупс вообще.

[identity profile] psilogic.livejournal.com 2015-08-17 08:13 pm (UTC)(link)
такой код не хочет работать на alt-linux с nfs: выглядит так, будто LOCK_NB игнорируется, второй инстанс виснет на системном вызове "futex"

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

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

NFS плохо работает с блокировками. Холмс, но зачем же для локальных процессов делать файл блокировки на NFS? Тем более что есть специальное место /var/lock/subsys.

[identity profile] psilogic.livejournal.com 2015-08-18 08:06 am (UTC)(link)
Что значит зачем - у меня выбора нет. Работать должно по возможности везде.

А /var/lock/subsys - он в этом смысле отличается от прочих мест?

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

Var lock subsys размещается на локальной (иногда временной) файловой системе, и ограничений нфс не имеет.


А пидфайлы, если это важно, кладут в var run

[identity profile] psilogic.livejournal.com 2015-08-18 04:42 pm (UTC)(link)
В общем, на другом компе sfdisk показывает тип файл. системы 83 ("Linux") и все равно тот же глюк. В конце-концов прога заработала через пид-файл и signal(pid, 0).

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

sfdisk вообще не о том показывает, не надо туда смотреть. Тип файлухи можно увидеть например командой mount без параметров.

[identity profile] psilogic.livejournal.com 2015-08-18 06:03 pm (UTC)(link)
OK, завтра посмотрю

[identity profile] psilogic.livejournal.com 2015-08-21 01:52 pm (UTC)(link)
как оказалось, на компе
/ = ext4 (lockf работает)
/tmp = tmpfs (lockf работает)
/home = nfs (lockf не работает)
ну и дело было в /home/xen...

[identity profile] ujo.livejournal.com 2015-08-21 05:42 pm (UTC)(link)
Ага, ну вот всё и выяснилось. Спасибо, мне было интересно в чём же дело.