Есть ли простой способ определить, работает ли определенный процесс? Мне нужно знать, работает ли экземпляр моей программы в фоновом режиме, а если не вилка и создать фоновый процесс.Определите, работает ли процесс?
ответ
Обычно это делается с помощью pidfiles: файла в /var/run/[name].pid, содержащего только идентификатор процесса, возвращаемый fork().
if pidfile exists: exit() else: create pidfile pid = start_background() pidfile.write(pid) On shutdown: remove pidfile
Обычно гонки бесплатный способ сделать это:
- Открыть замок файл/PID-файл для записи (но не укоротить его)
- Попытка взять эксклюзивную блокировку он (используя fcntl или flock) без блокировки
- Если это не удается с EAGAIN, то другой процесс уже запущен.
- Дескриптор файла должен теперь быть унаследован демоном и остается открытым для его жизни
Преимущество делать это более просто хранения PID, в том, что если кто-то повторно в PID, вы не получите ложно положительный.
Самая большая проблема с хранением pid в файле заключается в том, что низкоуровневый pid, используемый демонами запуска системы, может повторно использоваться при последующей перезагрузке другим демоном. Я видел это.
Linux программное обеспечение, по большому счету все равно об исключительности программ, только ресурсы, которые они используют. «Забота» чаще всего обеспечивается внедрением (E.G. инфраструктурой дистрибутива).
Например, если вы хотите запустить программу, но эта программа блокирует или превращает зомби, и у вас нет возможности ее убить или она работает как другой пользователь, выполняющий какую-то другую функцию. Почему программа должна заботиться о том, работает ли другая копия себя? Имея это, только кажется ненужным ограничением.
Если это процесс, который открывает сокет (например, порт TCP), программа не работает, если он не может открыть сокет. Если ему нужен эксклюзивный доступ к файлу, попробуйте его, если он не сможет его получить. Поддержите файл PID, но не делайте его обязательным.
Вы увидите эту методологию по всему программному обеспечению GNU, что является частью того, что делает ее такой универсальной.
- 1. Определите, работает ли процесс
- 2. Определите, активен ли процесс
- 3. Определите, завершен ли процесс?
- 4. Определите, приостановлен ли процесс
- 5. Определите, был ли процесс перезапущен
- 6. Определите, был ли процесс предварительно упущен/заблокирован
- 7. Определите, является ли родительский процесс терминалом
- 8. Определите конкретный процесс
- 9. Определите, работает ли сайт HTTPS
- 10. Определите из кода, в котором пользователь мой процесс работает как
- 11. Проверьте, работает ли процесс
- 12. Определите, с какого ядра работает процесс Node.js во время выполнения
- 13. Определите, какой процесс/программа запустит мой процесс/программу
- 14. Определите, имеет ли Windows-процесс право создавать символическую ссылку
- 15. Определите процесс pid, прослушивающий определенный порт
- 16. Android: Определите, какой процесс запуска вашего приложения?
- 17. Определите, работает ли рельсы под веб-сервером
- 18. Определите, работает ли скрипт в pythonw?
- 19. Определите, работает ли Tomcat с Ruby
- 20. Определите, работает ли Glimpse во время Application_BeginRequest()
- 21. Определите, работает ли устройство Android Wear
- 22. Определите, работает ли контроль над объявлением
- 23. Определите, работает ли программа на удаленном компьютере
- 24. Определите, работает ли протокол Gossip с Cassandra?
- 25. Определите, какой сетевой адаптер использует процесс
- 26. Определите процесс и приложение и убейте процесс Windows
- 27. Проверьте, не работает ли процесс
- 28. Проверьте, работает ли процесс WINWORD.EXE?
- 29. Как узнать, работает ли процесс?
- 30. Как проверить, работает ли процесс
Я не вижу много файлов pid в этой папке, многое отсутствует. Где-то еще? – Blackbinary
Вот где системные pidfiles должны быть помещены в соответствии с [FHS] (http://www.pathname.com/fhs/2.2/fhs-5.13.html). Если вы пишете программу на уровне пользователя, вы можете поместить pidfile в домашний каталог пользователя (~ /. [Name]/[name] .pid). – i80and
Этот подход вводит условие гонки, не так ли? – Vlad