Если есть несколько способов, перечислите их. Я знаю только один, но мне интересно, есть ли более чистый, в-рубиновый способ.
Как я могу проверить Ruby, работает ли процесс с определенным pid?
Ответ 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, если это не