Мне нужно увидеть, запущен ли данный идентификатор процесса, и он должен работать либо на Java, либо на JRuby (желательно в решении Ruby). Он может зависеть от системы для Linux (в частности, Debian и / или Ubuntu).
У меня уже есть PID, который я ищу, просто нужно посмотреть, работает ли он в настоящее время.
ОБНОВИТЬ:
Всем спасибо за ответы! Я ценю это, однако это не совсем то, что я ищу ... Я надеюсь на что-то в стандартной библиотеке Ruby (или Java, но предпочтительно Ruby) ... если такого вызова библиотеки не существует, я, вероятно, буду придерживаться решение procfs у меня уже есть.




Из мой ответ на этот вопрос я думал просто снова использовать procfs, проверяя, существует ли данный каталог через File.exist? "/ proc / # {pid}". Это сработало в jirb:
irb(main):001:0> File.exist? "/proc/5555" => false irb(main):002:0> File.exist? "/proc/7677" => true
Однако я все же предпочел бы использовать метод, который специально существует для определения того, запущен ли процесс ... например, Process.exist? (Pid) ... которого, к сожалению, не существует, что я видел.
Я не могу говорить от имени JRuby, но в Java единственный способ проверить, запустили ли вы процесс с Java (в этом случае у вас будет экземпляр Процесс, с которым вы могли бы что-то делать).
Спасибо, но, к сожалению, это не дочерний процесс.
Что ж, выстрел стоил. :)
Возможно, вы захотите дважды проверить используемую JVM. Но если вы отправите сигнал SIGQUIT kill -3, я полагаю (у меня нет удобного терминала). Это должно сгенерировать файл Javacore, в котором будут трассировки стека используемого потока, проверьте наличие пакетов JRuby в этом файле.
Он не должен заканчиваться или что-то в этом роде, но, как всегда, будьте осторожны, отправляя сигналы.
Если вы не против создать совершенно новый процесс, тогда вам подойдет этот ленивый способ:
def pid_exists? (pid)
system "ps -p #{pid} > /dev/null"
return $? == 0
end
Для большинства вариантов пс он должен возвращать 0 в случае успеха и ненулевое значение в случае ошибки. Обычная ошибка при использовании вышеупомянутого - не найти процесс с данным PID. Версия пс, которая у меня есть под Ubuntu, в этом случае возвращает 256.
Вы также можете использовать Process.kill для отправки сигнала 0 процессу (сигнал 0 указывает, может ли быть отправлен сигнал), но это, похоже, работает только в том случае, если вы владеете процессом, которому отправляете сигнал (или иным образом имеете разрешения на отправку сигналов).
В Unix есть особенность - системный вызов kill при нулевом сигнале. Выполняется проверка ошибок, но сигнал не отправляется.
def pid_exists? (pid)
system "kill -0 #{pid}"
return $? == 0
end
Одно предостережение: при этом не будут обнаружены процессы с этим pid, на отправку которых у вас нет разрешения.
Оператор возврата не требуется. «Системный» вызов возвращает истину / ложь, чтобы указать, успешно ли выполнена команда.
Комментарий Даррона был точным, но вместо того, чтобы вызывать двоичный файл kill, вы можете просто использовать метод Ruby Process.kill с сигналом 0:
#!/usr/bin/ruby
pid = ARGV[0].to_i
begin
Process.kill(0, pid)
puts "#{pid} is running"
rescue Errno::EPERM # changed uid
puts "No permission to query #{pid}!";
rescue Errno::ESRCH
puts "#{pid} is NOT running."; # or zombied
rescue
puts "Unable to determine status for #{pid} : #{$!}"
end
[user@host user]$ ./is_running.rb 14302
14302 is running[user@host user]$ ./is_running.rb 99999
99999 is NOT running.[user@host user]$ ./is_running.rb 37
No permission to query 37![user@host user]$ sudo ./is_running.rb 37
37 is running
Ссылка: http://pleac.sourceforge.net/pleac_ruby/processmanagementetc.html
Вы можете использовать инструмент командной строки jps, который поставляется с вашей установкой java. jps перечисляет все java-процессы пользователя.
Например.
>jps -l
5960 org.jruby.Main
2124 org.jruby.Main
5376 org.jruby.Main
4428 sun.tools.jps.Jps
Или, если вам нужно передать результаты в свой скрипт, вы можете использовать% x [..]:
>> result = %x[jps -l]
=> "5960 org.jruby.Main\n2264 sun.tools.jps.Jps\n2124 org.jruby.Main\n5376 org.jruby.Main\n"
>> p result
"5960 org.jruby.Main\n2264 sun.tools.jps.Jps\n2124 org.jruby.Main\n5376 org.jruby.Main\n"
=> nil
Майк, заголовок вашего вопроса подразумевает, что вы хотите знать, является ли сам данный PID процессом Java | JRuby. Остальная часть вопроса предполагает, что вы намереваетесь только Java | JRuby узнать о выходе данного PID. Просьба уточнить!