Послание линуксоидам
Aug. 17th, 2015 08:36 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
А вот просветите прожженного вындузоида насчет одной вещи.
Есть ли в линухе хоть какой-нибудь ресурс, который саморазлочивается при грубом убийстве программы? Хочется сделать защиту от одновременного запуска двух 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
Есть ли в линухе хоть какой-нибудь ресурс, который саморазлочивается при грубом убийстве программы? Хочется сделать защиту от одновременного запуска двух 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
no subject
Date: 2015-08-17 05:41 pm (UTC)no subject
Date: 2015-08-17 05:43 pm (UTC)no subject
Date: 2015-08-17 05:48 pm (UTC)непонятно что ты хочешь сделать вообще говоря, но тебе надо взять любого линупсового демона, посмотреть чего у него внутре и делать так же.
no subject
Date: 2015-08-17 05:56 pm (UTC)а не подскажет ли уважаемый дон, который из сигналов считается "кошерным" для этой цели?
SIGUSR1 с предварительным signal(SIGUSR1, SIG_IGN)?
что я хочу - защиту от одновременного запуска двух instance, которая не требует танцев с бубном, если прога йопнулась или была йопнута через kill -9
no subject
Date: 2015-08-17 06:03 pm (UTC)no subject
Date: 2015-08-17 06:06 pm (UTC)ну все равно хоть какой-то выход, спасибо! :)
no subject
Date: 2015-08-17 06:56 pm (UTC)no subject
Date: 2015-08-17 08:20 pm (UTC)no subject
Date: 2015-08-17 10:24 pm (UTC)"а руки то помнят!"
no subject
Date: 2015-08-17 06:14 pm (UTC)no subject
Date: 2015-08-17 06:16 pm (UTC)no subject
Date: 2015-08-17 06:32 pm (UTC)no subject
Date: 2015-08-17 06:37 pm (UTC)винды не позволяют удалять открытый файл, никсы - позволяют
no subject
Date: 2015-08-17 06:54 pm (UTC)no subject
Date: 2015-08-17 08:15 pm (UTC)no subject
Date: 2015-08-18 07:34 am (UTC)no subject
Date: 2015-08-17 10:33 pm (UTC)no subject
Date: 2015-08-17 06:53 pm (UTC)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
}
no subject
Date: 2015-08-17 06:55 pm (UTC)no subject
Date: 2015-08-17 06:56 pm (UTC)no subject
Date: 2015-08-17 06:57 pm (UTC)no subject
Date: 2015-08-17 08:14 pm (UTC)no subject
Date: 2015-08-18 07:32 am (UTC)no subject
Date: 2015-08-17 08:13 pm (UTC)no subject
Date: 2015-08-17 10:35 pm (UTC)no subject
Date: 2015-08-18 03:56 am (UTC)NFS плохо работает с блокировками. Холмс, но зачем же для локальных процессов делать файл блокировки на NFS? Тем более что есть специальное место /var/lock/subsys.
no subject
Date: 2015-08-18 08:06 am (UTC)А /var/lock/subsys - он в этом смысле отличается от прочих мест?
no subject
Date: 2015-08-18 10:07 am (UTC)Var lock subsys размещается на локальной (иногда временной) файловой системе, и ограничений нфс не имеет.
А пидфайлы, если это важно, кладут в var run
no subject
Date: 2015-08-18 04:42 pm (UTC)no subject
Date: 2015-08-18 05:29 pm (UTC)sfdisk вообще не о том показывает, не надо туда смотреть. Тип файлухи можно увидеть например командой mount без параметров.
no subject
Date: 2015-08-18 06:03 pm (UTC)no subject
Date: 2015-08-21 01:52 pm (UTC)/ = ext4 (lockf работает)
/tmp = tmpfs (lockf работает)
/home = nfs (lockf не работает)
ну и дело было в /home/xen...
no subject
Date: 2015-08-21 05:42 pm (UTC)no subject
Date: 2015-08-17 06:55 pm (UTC)no subject
Date: 2015-08-17 08:18 pm (UTC)no subject
Date: 2015-08-17 10:31 pm (UTC)no subject
Date: 2015-08-17 10:37 pm (UTC)no subject
Date: 2015-08-17 10:47 pm (UTC)no subject
Date: 2015-08-18 09:32 am (UTC)Открыть именованный сокет - самое правильное решение. А писать код с нуля - вовсе не обязательно. Простенький код для сервера доступен в более или любом фреймворке.
no subject
Date: 2015-08-18 09:43 am (UTC)no subject
Date: 2015-08-18 10:11 am (UTC)no subject
Date: 2015-08-18 04:01 am (UTC)Она видимо и есть лучшая, потому что традиционно её используют. Но вот процесс по пид файлу с PID лучше проверять по наличию в таблице процессов и сверять, тот ли это процесс, номер и заместить могут.
no subject
Date: 2015-08-18 08:14 am (UTC)no subject
Date: 2015-08-18 10:03 am (UTC)Если "везде" касалось только линуксов, тогда проверять /proc/pidnumber/args и /proc/pidnumber/exe
no subject
Date: 2015-08-18 01:59 pm (UTC)no subject
Date: 2015-08-18 05:27 pm (UTC)Сильно у вас бомбит. Впрочем, сочувствую опыту работы с только одной системой.
no subject
Date: 2015-08-18 10:11 pm (UTC)