LINUX.ORG.RU

Как в linux-системе однозначно идентифицировать процесс?


0

1

Допустим в системе работает некий процесс, и нам и известен его PID. Задача: сохранить об этом процессе какую-то информацию, чтобы затем можно было в любой момент проверить, что этот процесс всё ещё работает. Очевидный вариант с сохранением только PID не надёжен, так как после смерти процесса его PID может занять другой процесс. Как решить задачу?

Deleted

Почему-то в голову приходит только

popen(«ps -p __PID__ -o pid,start»);

Не бейте меня больно :-D

ASM ★★
()

так как после смерти процесса его PID может занять другой процесс

Ну проверить, что у него cmdline нужный, нет?

vga ★★
()
Ответ на: комментарий от as33

sessionid?

Ты про /proc/$PID/sessionid? Не подходит.

while true; do cat /proc/self/sessionid; echo; done
- выдаёт тонны единиц =).

Deleted
()
Ответ на: комментарий от Deleted

cmdline тоже может быть одинаковый.

Ужос :-). Но чем-то они должны отличаться? Пихать в environment гуид и смотреть /proc/$PID/environ

vga ★★
()
Ответ на: комментарий от vga

Пихать в environment гуид и смотреть /proc/$PID/environ

Нет возможности, так как процессы, которые нужно мониторить, мне не подконтрольны.

Deleted
()

> Очевидный вариант с сохранением только PID не надёжен, так как после смерти процесса его PID может занять другой процесс.

У другого процесса будет отличаться время старта.

Aceler ★★★★★
()
Ответ на: комментарий от ASM

Почему-то в голову приходит только

popen(«ps -p __PID__ -o pid,start»);

Не бейте меня больно :-D

Вообще это самый близкий вариант. Но есть два НО:

[*] Тогда уж сразу читать время из /proc/$PID/stat
[*] Время там недостаточно точное. _Теоретически_ могут запуститься и убиться (очень очень быстро) два разных процесса, у которых будет один PID и одно и то же время в /proc/$PID/stat. Хотя это уже из области фантастики =).
Наверное так и буду делать...

Deleted
()
Ответ на: комментарий от Aceler

У другого процесса будет отличаться время старта.

Только что написал. Наверное так и буду делать.

Deleted
()
Ответ на: комментарий от Deleted

> Тогда уж сразу читать время из /proc/$PID/stat

Хм, вариант с ps наиболее верен с точки зрения POSIX ;-)

А вообще да, никак не могу приучить себя исползовать /proc и /sys. Вот не знаю, хорошо это или плохо....

(хотя, наверное, /sys не нужен, так как есть udev/hal/dbus)

ASM ★★
()

а если написать модуль ядра, который будет следить за запущенными процессами ?

x905 ★★★★★
()
Ответ на: комментарий от x905

а если написать модуль ядра, который будет следить за запущенными процессами ?

Постоянно следить можно и через netlink, там уже есть готовый интерфейс для этого. Мне интересно решение именно без постоянной слежки.

Deleted
()
Ответ на: комментарий от Deleted

>_Теоретически_ могут запуститься и убиться (очень очень быстро) два разных процесса, у которых будет один PID и одно и то же время в /proc/$PID/stat.

Помоему это что-то из области фантастики, если учесть то, как linux раздает PID'ы.

Dead ★★★★
()
Ответ на: комментарий от Dead

Помоему это что-то из области фантастики, если учесть то, как linux раздает PID'ы.

Тем не менее, вот такой однострочник:

while true; do readlink /proc/self; done
Начинает выводить повторяющиеся PID'ы каждые полминуты =).

Deleted
()
Ответ на: комментарий от Deleted

>> Время там недостаточно точное. _Теоретически_ могут запуститься и убиться (очень очень быстро) два разных процесса, у которых будет один PID и одно и то же время в /proc/$PID/stat. Хотя это уже из области фантастики =).

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

Насколько я понимаю это фича и также должно быть и в других юникс-подобных системах.

sergej ★★★★★
()
Ответ на: комментарий от sergej

какой шустрый у тебя комп

Да я бы не сказал, что он шустрый...

Deleted
()

А запустить этот процесс из своей программы нельзя? Ведь если из твоего процесса запущено приложение, то без твоего ведома pid никто не освободит для другого процесса (см. zombie).

pathfinder ★★★★
()

Написать рулес для auditd.

Написать утиль, который форкается и запускает бинарник. Получать статус о чайлде через wait() & co.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.