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

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

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


UPDATE:

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

Ответы [ 7 ]

10 голосов
/ 14 октября 2008

Комментарий Даррона был точным, но вместо вызова двоичного файла «kill» вы можете просто использовать метод Process.kill в Ruby с сигналом 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 работает

[user @ host user] $ ./is_running.rb 99999
99999 НЕ работает.

[user @ host user] $ ./is_running.rb 37
Нет разрешения на запрос 37!

[user @ host user] $ sudo ./is_running.rb 37
37 работает

Ссылка: http://pleac.sourceforge.net/pleac_ruby/processmanagementetc.html

5 голосов
/ 27 сентября 2008

Unix имеет специальную функцию системного вызова kill вокруг нулевого сигнала. Проверка ошибок выполняется, но сигнал не отправляется.

def pid_exists? (pid)
    system "kill -0 #{pid}"
    return $? == 0
end

Одно предостережение: при этом pid не будут обнаружены процессы, для которых у вас нет разрешения на сигнализацию.

2 голосов
/ 26 сентября 2008

С мой ответ на этот вопрос , я думал о том, чтобы просто снова использовать procfs, проверив, существует ли данный каталог через File.exist? "/ Proc / # {PID}". Это сработало в джирб:

irb(main):001:0> File.exist? "/proc/5555"
=> false
irb(main):002:0> File.exist? "/proc/7677"
=> true

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

0 голосов
/ 25 ноября 2010

Вы можете использовать инструмент командной строки 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
0 голосов
/ 27 сентября 2008

Если вы не против создать целый новый процесс, тогда этот ленивый способ должен сработать:

def pid_exists? (pid)
    system "ps -p #{pid} > /dev/null"
    return $? == 0
end

Для большинства вариантов ps он должен возвращать 0 в случае успеха и ненулевое значение в случае ошибки. Обычной ошибкой с использованием выше будет не найти процесс с данным PID. Версия ps , которую я имею под Ubuntu, возвращает 256 в этом случае.

Вы также можете использовать Process.kill для отправки сигнала 0 процессу (сигнал 0 указывает, может ли сигнал быть отправлен), но, похоже, это работает, только если вы являетесь владельцем процесса, которому вы отправляете сигнал ( или иным образом иметь права на отправку ему сигналов).

0 голосов
/ 26 сентября 2008

Возможно, вы захотите перепроверить для используемой вами JVM. Но если вы отправите сигнал SIGQUIT kill -3, я полагаю, (у меня нет удобного терминала). Это должно сгенерировать файл Javacore, который будет иметь следы стека используемого потока, проверьте пакеты JRuby в этом файле.

Оно не должно прерываться или что-либо, но как всегда будьте осторожны при отправке сигналов.

0 голосов
/ 26 сентября 2008

Я не могу говорить за JRuby, но в Java единственный способ проверить, если вы запустили процесс из Java (в этом случае у вас будет экземпляр Process , чтобы вы могли что-то делать с).

...