Подтвердить что ты не робот

Как я могу проверить Ruby, работает ли процесс с определенным pid?

Если есть несколько способов, перечислите их. Я знаю только один, но мне интересно, есть ли более чистый, в-рубиновый способ.

4b9b3361

Ответ 1

Если это процесс, который вы ожидаете "самостоятельно" (например, вы используете это для проверки pid для контролируемого процесса), вы можете просто отправить sig 0 на него.

>> Process.kill 0, 370
=> 1
>> Process.kill 0, 2
Errno::ESRCH: No such process
    from (irb):5:in `kill'
    from (irb):5
>> 

Ответ 2

Разница между подходами Process.getpgid и Process::kill, по-видимому, заключается в том, что происходит, когда pid существует, но принадлежит другому пользователю. Process.getpgid вернет ответ, Process::kill выдаст исключение (Errno::EPERM).

Исходя из этого, я рекомендую Process.getpgid, если только по той причине, что это избавит вас от необходимости улавливать два разных исключения.

Вот код, который я использую:

begin
  Process.getpgid( pid )
  true
rescue Errno::ESRCH
  false
end

Ответ 3

@John T, @Dustin: На самом деле, ребята, я просмотрел Process rdocs и выглядит как

Process.getpgid( pid )

является менее жестоким средством применения той же техники.

Ответ 4

Для дочерних процессов другие решения, такие как отправка сигнала, не будут вести себя так, как ожидалось: они укажут, что процесс все еще работает, когда он действительно вышел.

Вы можете использовать Process.waitpid, если хотите проверить процесс, который вы породили самостоятельно. Вызов не будет блокироваться, если вы используете флаг Process::WNOHANG, и nil будет возвращен до тех пор, пока дочерний процесс не завершится.

Пример:

pid = Process.spawn('sleep 5')
Process.waitpid(pid, Process::WNOHANG) # => nil
sleep 5
Process.waitpid(pid, Process::WNOHANG) # => pid

Если pid не принадлежит дочернему процессу, будет выбрано исключение (Errno::ECHILD: No child processes).

То же самое относится к Process.waitpid2.

Ответ 5

Вы можете попробовать использовать

Process::kill 0, pid

где pid - число pid, если pid работает, он должен возвращать 1.

Ответ 6

В Linux вы можете получить множество атрибутов запущенной программы с помощью файловой системы proc:

File.read("/proc/#{pid}/cmdline")
File.read("/proc/#{pid}/comm")

Ответ 7

Вот как я это делал:

def alive?(pid)
  !!Process.kill(0, pid) rescue false
end

Ответ 8

A *nix - единственный подход заключается в том, чтобы выполнить shell-out до ps и проверить, существует ли в возвращаемой строке разделитель \n (новая строка).

Пример вывода IRB

1.9.3p448 :067 > `ps -p 56718`                                                          
"  PID TTY           TIME CMD\n56718 ttys007    0:03.38 zeus slave: default_bundle   \n"

Упакованный как метод

def process?(pid)  
  !!`ps -p #{pid.to_i}`["\n"]
end

Ответ 9

Я рассматривал эту проблему раньше, и вчера я скомпилировал ее в " process_exists.

Он отправляет нулевой сигнал (0) в процесс с данным pid, чтобы проверить, существует ли он. Он работает, даже если текущий пользователь не имеет прав на отправку сигнала в процесс приема.

Использование:

require 'process_exists'

pid = 12
pid_exists = Process.exists?(pid)

Ответ 10

Это работало для меня, когда я проверял, воспроизводится ли песня в коде Ruby

def process_running?(pid)
  return true if pid
  false
end

def play_song_for_real
  @process_id = fork { exec 'afplay', $song_path }
end

если вы проверите process_running(@process_id), вы получите правду, если процесс запущен или false, если это не