alibek Posted June 25, 2019 Posted June 25, 2019 Где бы почитать про сабж? В частности меня интересует, гарантируется ли уникальность PID в течение какого-либо интервала времени? Допустим я запустил процесс, зафиксировал его pid и периодически проверяю, живой ли этот процесс. Но не может быть так, что в периоде между проверками мой процесс помрет, и запустится другой процесс, но с таким же pid? Вставить ник Quote
LostSoul Posted June 25, 2019 Posted June 25, 2019 Сквозная нумерация , по порядку , по кругу. Как сделает полный круг возможно повторное использование. По крайней мере до ядра 3 Windows аналогично Вставить ник Quote
jffulcrum Posted June 25, 2019 Posted June 25, 2019 BTW, в Win7 максимальный размер записи HANDLES (откуда берутся и PID) стал DWORD, то есть столкнуться с дублями PID стало практически нереально (практически больше 200 000 я не видел). В Unix дефолтом максимальный номер 32768 (15 бит), но тоже можно задрать размерность до 22 бит (опять же практически нереально исчерпать на практике) - гуглите pid_max Вставить ник Quote
MATPOC Posted June 25, 2019 Posted June 25, 2019 Многие дистрибутивы (или патчи для ядра) борются с предсказанием pid - генерят случайные pid. Вставить ник Quote
st_re Posted June 25, 2019 Posted June 25, 2019 гарантия уникальности только в смысле что ОДНОВРЕМЕННО 2-х процессов с одинаковый пид не бывает. Но после смерти процесса его пид имеет право быть назначен следующему хоть сразу (если цикл дошел). Увеличение kernel.pid_max (kern.pid_max итд) только снижает вероятность такого переиспользования, т.к. увеличивает цикл. в линуксе на пятом ядре у меня kernel.pid_max = 4194304. Во фре 99999 уже с 8 версии или даже раньше. во фре еще можно сделать kern.randompid > 1 тогда новый пид будет не +1 а +случайное число от 1 до kern.randompid. Для линукса в ядро вроде не принесли такое же, но патчи есть и вроде как есть дистрибутивы с подобной функциональностью... Вставить ник Quote
alibek Posted June 25, 2019 Author Posted June 25, 2019 Мне будет достаточно, если в течение какого-то времени (скажем часа) PID гарантированно не повториться. Но как я понял, такой гарантии не будет, можно только снизить вероятность, увеличив pid_max. А рандомизация pid эту вероятность скорее даже повысит. Тогда нужно дополнительно проверить, соответствует ли pid искомому процессу. Разумеется можно проверять имя процесса, но это не гарантия. Думаю, что комбинацию pid+comm+lstart можно считать уникальной. Вставить ник Quote
jffulcrum Posted June 25, 2019 Posted June 25, 2019 @alibek Ну так пусть процесс файлик со своим текущим PID формирует в опред.месте - тогда вы его всегда найдете, как это делают чуть менее, чем все демоны во фряхе. Вставить ник Quote
alibek Posted June 25, 2019 Author Posted June 25, 2019 Так не в файле дело. Процесс стартует, его идентификатор в pid-файл сохраняется. А потом процесс вылетает аварийно, а файл остается. А если потом новый процесс тот же pid получит, как понять, что было аварийное завершение? Только что сохранять помимо pid еще и дату/время старта процесса. Вставить ник Quote
st_re Posted June 25, 2019 Posted June 25, 2019 ну как минимум по имени процесса тоже сверять.. Вставить ник Quote
orlik Posted June 25, 2019 Posted June 25, 2019 Почему бы не сделать проверку не только по pid , но и по имени процесса ? Вставить ник Quote
alibek Posted June 25, 2019 Author Posted June 25, 2019 Имя — это comm, я его указывал. Но его недостаточно, поэтому лучше проверять еще и lstart. Вставить ник Quote
st_re Posted June 25, 2019 Posted June 25, 2019 открываете лок файл при старте, если лочится - значит процесс жив, если нет, то ой, нету. Вставить ник Quote
NewUse Posted June 25, 2019 Posted June 25, 2019 да, проблема решается через flock, не надо изобретать велосипед. Вставить ник Quote
alibek Posted June 25, 2019 Author Posted June 25, 2019 Э... Это если процесс свой. А если чужой и он lock-файлов не держит? Вставить ник Quote
ixi Posted June 25, 2019 Posted June 25, 2019 systemd сделает всё за вас (PIDFile=) Вставить ник Quote
alibek Posted June 25, 2019 Author Posted June 25, 2019 Ну, в systemd и pid-файл не нужен, он и так отловит падение процесса, и на это событие можно повесить нужные задания. У меня сервер без systemd. Да и вообще, интересно автономное решение, академический такой интерес. Вставить ник Quote
st_re Posted June 25, 2019 Posted June 25, 2019 1 час назад, alibek сказал: Э... Это если процесс свой. А если чужой и он lock-файлов не держит? Еcли процесс не форкается, то flock есть не только (2) но и (1) (ну или (3)и(8) на более других ОС :) man 1 flock flock [options] <file|directory> <command> [command args] есть pwait Есть так же всякие пускалки типа daemon, daemontools или, как тут уже сказали про, не к ночи будь помянут. systemd, умеет пускать как с пид файлом так и без, как форкающегося так и не форкающегося, как перезапускать, так и запускать чтото третье по факту падения. Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.