Как я могу определить, работает ли другой идентификатор процесса с использованием Java или JRuby в Linux?

Мне нужно увидеть, запущен ли данный идентификатор процесса, и он должен работать либо на Java, либо на JRuby (желательно в решении Ruby). Он может зависеть от системы для Linux (в частности, Debian и / или Ubuntu).

У меня уже есть PID, который я ищу, просто нужно посмотреть, работает ли он в настоящее время.


ОБНОВИТЬ:

Всем спасибо за ответы! Я ценю это, однако это не совсем то, что я ищу ... Я надеюсь на что-то в стандартной библиотеке Ruby (или Java, но предпочтительно Ruby) ... если такого вызова библиотеки не существует, я, вероятно, буду придерживаться решение procfs у меня уже есть.

Майк, заголовок вашего вопроса подразумевает, что вы хотите знать, является ли сам данный PID процессом Java | JRuby. Остальная часть вопроса предполагает, что вы намереваетесь только Java | JRuby узнать о выходе данного PID. Просьба уточнить!

David Schmitt 26.09.2008 23:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
6 738
7

Ответы 7

Из мой ответ на этот вопрос я думал просто снова использовать 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 (в этом случае у вас будет экземпляр Процесс, с которым вы могли бы что-то делать).

Спасибо, но, к сожалению, это не дочерний процесс.

Mike Stone 26.09.2008 22:43

Что ж, выстрел стоил. :)

Michael Myers 26.09.2008 22:45

Возможно, вы захотите дважды проверить используемую 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, на отправку которых у вас нет разрешения.

Оператор возврата не требуется. «Системный» вызов возвращает истину / ложь, чтобы указать, успешно ли выполнена команда.

JesperE 27.09.2008 11:31

Комментарий Даррона был точным, но вместо того, чтобы вызывать двоичный файл 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

Другие вопросы по теме