Для чего нужны файлы pid и lock?

75

Я часто вижу, что программы указывают файлы pid и lock. И я не совсем уверен, что они делают.

Например, при компиляции nginx:

--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \

Может кто-нибудь пролить свет на этот?

Стан
источник

Ответы:

86

pid-файлы пишутся некоторыми программами для записи их идентификатора процесса во время их запуска. Это имеет несколько целей:

  • Это сигнал другим процессам и пользователям системы, что эта конкретная программа запущена или, по крайней мере, успешно запущена.
  • Это позволяет очень легко написать скрипт, проверить, работает ли он, и выполнить простую killкоманду, если кто-то хочет завершить его.
  • Для программы это дешевый способ узнать, не был ли предыдущий запущенный экземпляр успешно завершен.

Разумеется, наличие pid-файла не гарантирует, что этот конкретный идентификатор процесса работает, поэтому этот метод не на 100% надежен, но во многих случаях «достаточно хорош». Проверка наличия определенного PID в таблице процессов не является полностью переносимой в UNIX-подобных операционных системах, если только вы не хотите зависеть от psутилиты, которую может быть нежелательно вызывать во всех случаях (и я считаю, что некоторые UNIX-подобные операционные системы В psлюбом случае реализовать по- другому).

Файлы блокировки используются программами для обеспечения того, чтобы два (с хорошим поведением) отдельных экземпляра программы, которые могут одновременно работать в одной системе, не обращались к чему-то другому одновременно. Идея состоит в том, что прежде чем программа получит доступ к своему ресурсу, она проверяет наличие файла блокировки, и, если файл блокировки существует, либо выдает ошибку, либо подождите, пока она не исчезнет. Когда он не существует, программа, желающая «приобрести» ресурс, создает файл, а затем другие экземпляры, которые могут встретиться позже, будут ожидать завершения этого процесса. Конечно, это предполагает, что программа, «получающая» блокировку, фактически снимает ее и не забывает удалить файл блокировки.

Это работает, потому что файловая система во всех UNIX-подобных операционных системах обеспечивает сериализацию , что означает, что в любой момент времени происходит только одно изменение файловой системы. Вроде как блокировки с базами данных и тому подобное.

LawrenceC
источник
1
Это правильно, если только файл блокировки не удален вручную. VMWare Player демонстрирует это поведение, например, если VMWare Player дает сбой, вы должны удалить .lckфайл в каталоге виртуальной машины, в противном случае он сообщит вам, что он используется, когда вы попытаетесь запустить его.
LawrenceC
1
А как насчет Windows? Как он обрабатывает файлы .lock? В конце концов, это не похоже на Unix.
SarahofGaia
2
Я не думаю, что программы для Windows работают так. Единственные программы с таким поведением, которые я видел, это порты из Unix / Linux
HaMster
2
LawrenceC, Re " Когда его не существует, программа, желающая" приобрести "ресурс, создает файл "; Но есть специальные функции, специально созданные для такой синхронизации. Почему бы не полагаться на эти функции вместо того, чтобы использовать «взлом файла»?
Пейсер
1
@Pacerier - таким образом, файлы блокировки, вероятно, чаще используются такими вещами, как сценарии оболочки или программы, которые могут взаимодействовать со сценариями оболочки, поскольку оболочки Unix / Linux очень легко взаимодействуют с файловой системой, в отличие от других примитивов синхронизации. Файлы также легко сохраняются в разных процессах. Высокопроизводительная программа, очевидно, предпочла бы использовать собственные примитивы ОС по сравнению с файлами для внутренней синхронизации или даже по сравнению с другими процессами, которые не являются оболочками.
LawrenceC
14

Эти файлы часто используются демонами, которые должны запускаться в системе только один раз. Файл PID обычно содержит идентификационный номер процесса уже запущенной и запущенной программы, если таковая существует. Кроме того, когда он запускается, он создает файл блокировки. Пока существует файл блокировки, он не сможет запустить другой без вмешательства пользователя. Если файл блокировки существует, а идентификатор процесса, указанный в файле pid, не запущен, демон считается находящимся в «мертвом» состоянии, то есть он должен работать, но, вероятно, не из-за сбоя или неправильного завершения работы , Это может инициировать специальный сценарий запуска / перезапуска для некоторых программ. Правильное выключение приведет к удалению файла блокировки.

Калеб
источник
+1 Объяснение использования наличия файла блокировки и файла pid.
Кайл Крулл
@Caleb - Пожалуйста, объясните, почему будут использоваться как файл PID, так и файл блокировки. Кажется, будет достаточно файла PID. Если PID-файл существует, PID можно проверить, чтобы убедиться, что процесс запущен, просто нужно выполнить меньше шагов, чем проверить файл блокировки, проверить PID-файл, а затем проверить существование процесса.
MVaughan
@MVaughan Чтобы избежать условий гонки, если ничего больше. Некоторые приложения используют для случаев, когда PID все еще нужен, но может снять блокировку. Но на более фундаментальном уровне, если вы перегружаете один файл для обеих операций, вы открываете дверь к сбоям, таким как сбой, оставляющий несовместимое состояние в системе.
Калеб
8

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

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


источник