Как получить идентификатор процесса по имени процесса?Или как узнать, запущен ли еще процесс с заданным идентификатором процесса?
Нет надежного способа сделать это в оболочке.В некоторых системах идентификаторы процессов повторного использования очень похожи на файловые дескрипторы.То есть они используют pid с наименьшим номером, который в данный момент не используется при запуске нового процесса.Это означает, что искомый pid есть, но он может не относиться к процессу, который, по вашему мнению, он выполняет.
Обычный подход заключается в разборе выходных данных ps, но это включает условие гонки, посколькуpid, который вы находите таким образом, может не относиться к тому же процессу, когда вы действительно что-то делаете с этим pid.Однако в сценарии оболочки нет подходящего пути, поэтому имейте в виду, что вы можете попасть в ловушку.
Одно из предложений - использовать pgrep if в Solaris и 'ps h -o pid -C $STRING ', если нет, и ваш ps поддерживает этот синтаксис, но ни один из них не является идеальным или вездесущим.
Нормальным решением при написании программ на C является создание файла pid, а затем блокировка его с помощью fcntl (2),Затем, если другая программа хочет узнать, действительно ли она запущена, она может попытаться заблокировать файл.Если попытка блокировки не удалась, он знает, что файл все еще работает.
У нас нет таких параметров в оболочке, если только мы не можем предоставить программу на C, которая может попытаться заблокировать сценарий.Несмотря на это, описанное выше состояние гонки все еще существует.