Стандарт или лучшая практика для уникального идентификатора процесса (в Unix-подобных ОС)

В системах Unix PID уникален только в любой момент времени. Он не уникален в заданном интервале времени, потому что идентификаторы PID, использовавшиеся в прошлом, можно использовать повторно после завершения исходного процесса. Для хранения данных истории всех процессов, которые были запущены в системе с момента загрузки, мне нужно, чтобы идентификаторы были уникальными с момента загрузки.

Есть ли какой-либо стандарт или лучшая практика для этого? Есть ли что-то неправильное или отсутствующее в моем предполагаемом решении ниже?

Предполагаемое решение

Кажется логичным использовать PID вместе со временем запуска процесса (как стандартное время Unix) в качестве уникальный идентификатор процесса. Такой идентификатор будет даже уникальным между перезагрузками.

Преимущества

  1. И PID, и время запуска процесса достаточно четко определены и имеют смысл во всех Unix-подобных системах.
  2. Оба значения являются целыми числами и относительно просты в обработке.
  3. Процессы можно однозначно сортировать по времени запуска, за которым следует PID.
  4. Оба значения могут использоваться не только для уникальной идентификации процессов.

Недостатки

  1. Кажется, нет переносимого способа получить время запуска процесса, кроме вызова внешней утилиты ps. Например в оболочке: date -d "$(ps -p $PID -o lstart=)" +%s. В Linux можно вычислить время запуска процесса с /proc/$PID/stat, но этот метод не работает в других системах.
  2. Из-за фактов в предыдущем пункте переносимый метод может быть излишне медленным и ресурсоемким.

person pabouk    schedule 01.08.2013    source источник


Ответы (1)


Служба ntp всегда корректирует системное время, которое влияет на время запуска, читаемое из "ps -p $pid -o lstart". В результате вы можете получить другое время начала после настройки системного времени.

person user2889076    schedule 17.10.2013
comment
Это очень хороший момент. Спасибо, что указали на эту ловушку. - person pabouk; 17.10.2013