В Ruby рассказывают, если системный процесс еще жив? - PullRequest
0 голосов
/ 18 января 2011

Если я запускаю приложение следующим образом

cmd = "some_app &"
`#{cmd}`

Как я могу узнать, что процесс еще жив?Я знаю, что есть различные способы получения pid запущенного приложения, и я мог бы тогда проверить, было ли это все еще доступно через ps -ef.Однако, это сообщило бы мне только, если бы существовал процесс с тем же pid, когда приложение могло быть убито ранее.Та же проблема существует с ps -ef | grep some_app подходом.

У кого-нибудь есть какие-нибудь идеи относительно чистого способа достижения этого?

Ответы [ 3 ]

4 голосов
/ 18 января 2011

Это не может быть сделано в общем случае;Возможности Unix для управления процессами ограничены и плохо интегрированы с остальной частью API ядра (например, нет способа получить дескриптор файла для процесса, который может быть передан в select или аналогичный).

Вы можете использовать семейство функций wait для блокировки или опроса выхода из дочернего процесса.Вы можете установить обработчик для SIGCHLD и получать асинхронные уведомления при выходе ребенка.И, в сотрудничестве с дочерним процессом, вы можете использовать канал или сокет, чтобы получить более подробную информацию о том, что происходит.Однако при активном отсутствии сотрудничества со стороны ребенка вы попадаете (например, ребенок, который сам разветвляется, выходит из него и вызывает внука setsidизбежал wait отслеживания в исходном родительском объекте.)

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

2 голосов
/ 18 января 2011

Исследовал это в предыдущем проекте ...

По-видимому, обычная практика - использовать Process.kill(0, pid), чтобы проверить pid, чтобы увидеть, сигнал может быть отправлен. Этот метод вернет true только в том случае, если оба процесса существуют и , и вызывающая сторона имеет разрешение сообщить об этом. Возвращаемое значение false может означать, что процесс не существует , или у пользователя нет соответствующего разрешения , или pid имеет неправильный тип (то есть строка) или ...

Вы можете поймать конкретное исключение, которое указывает на несуществование, Errno::ESRCH, "Нет такого процесса", отличающее его от отсутствия разрешения и т. Д.

def process_exists?(pid) begin Process.kill(0, pid) rescue Errno::ESRCH # "No such process" return false rescue Errno::EPERM # "Operation not permitted" # at least the process exists return true else return true end end

Очевидно, не пуленепробиваемый, но это начало ...

1 голос
/ 18 января 2011

$alive = true
Thread.new do
    `some_app`
    $alive = false
end

if $alive
  ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...