Убить дочерний процесс, который отделился от оболочки - PullRequest
4 голосов
/ 29 марта 2012

Я хочу управлять многими различными приложениями Sinatra из центрального приложения (Sinatra).

У меня проблема в том, каким образом я выполняю / spawn / fork вызов для его запуска, я не могу получить pid сервера Sinatra, чтобы я мог его убить (: int)?

Это связано с моей строкой оболочки exec, которая сначала содержит несколько других команд, поэтому я получаю pid первой. Моя командная строка похожа на

command = source ~/.profile; rbenv #{ver}; some_env=1234 ruby app.rb

Итак, я получил pid процесса sh команды sourcing.

Вопрос в том, как мне получить pid команды ruby, запущенной выше?

В настоящее время я использую spawn, но пробовал и большинство других, но я не думаю, что это проблема!?

pid = Process.spawn(command)
pid # => 1234

Само приложение ruby ​​запускается

$ ps aux
1234 sh -c . ~/.profile; shell_script
4567 shell_script

Я хочу знать 4567!?

Ответы [ 2 ]

0 голосов
/ 12 июля 2013

вы можете проверить, является ли процесс "shell_script" дочерним по отношению к "sh -c. ~ / .Profile; shell_script". Вы можете проверить это с помощью команды "ps -axgf".

, если это тактогда родитель может использовать идентификатор группы pid 1234 (получить его из выходных данных ps -axgf), чтобы убить дочернего элемента с помощью pid 4567, используя эту команду.

kill -9 -1234 (если предположить, что 1234 - этоидентификатор группы)

0 голосов
/ 29 марта 2012

Нет простого способа получить ваш '4567', но вы должны иметь возможность сделать так, чтобы ваш процесс имел тот же pid, что и Process.spawn.

Попробуйте завершить команду командой exec вместопрямой вызов ruby, то есть:

source ~/.profile; rbenv #{ver}; export some_env=1234; exec ruby app.rb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...