Как перехватить pid демона linux, запущенного из init.d - PullRequest
5 голосов
/ 29 апреля 2010

Я запустил демон службы, запустив двоичный файл (написанный на C ++) через файл сценария, хранящийся в rc5.d.

Но я не уверен, как перехватить pid процесса-демона и сохранить его в файле pid в /var/run/.pid. Так что я могу использовать пид для завершения. Как я могу это сделать?

Ответы [ 3 ]

8 голосов
/ 29 апреля 2010

Попробуйте использовать start-stop-daemon(8) с аргументом --pidfile в вашем скрипте инициализации. Пусть ваша программа записывает свой PID в указанное место (обычно это определяется в файле конфигурации).

Вам нужно обратить внимание на устаревшие PID-файлы, например, если файл блокировки сохранялся после перезагрузки. Эта логика лучше всего реализована в самом скрипте инициализации, поэтому опция --exec для start-stop-daemon.

Например, если /var/run/foo.pid равно 1234, а /proc/1234/exe не является вашим сервисом, файл блокировки устарел и должен быть тихо удален, что позволяет сервису нормально запускаться.

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

Например: (пример: / etc / default / foo):

PIDFILE=/var/run/foo.pid
OTHEROPTION=foo

Затем в /etc/init.d/foo:

[ -f /etc/default/foo ] && . /etc/default/foo

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

1 голос
/ 29 апреля 2010

Вы можете пойти более чем одним путем:

  1. В вашей программе используйте getpid , чтобы записать его в настраиваемый файл (возможно, в ENV)
  2. Используйте $! после запуска программы (у меня это не работает на archlinux: -?)
  3. После запуска программы используйте pidof
1 голос
/ 29 апреля 2010

Если вам известен порт, открытый программой, используйте команду fuser для определения pid.

...