2009-12-18 6 views

답변

12

당신은 함께 현재의 프로세스를 얻을 수 있습니다 :

Process.pid 

더 자세한 내용은 http://whynotwiki.com/Ruby_/_Process_management를 참조하십시오.

그런 다음 운영 관련 명령을 사용하여 하위 pid를 가져올 수 있습니다. 유닉스 기반 시스템이 내가 ps -ef의 출력이 다른 유닉스 맛에 약간 다릅니다 생각으로이 아마 모든 유닉스 시스템에서 작동하지 않음을 인정

# Creating 3 child processes. 
IO.popen('uname') 
IO.popen('uname') 
IO.popen('uname') 

# Grabbing the pid. 
pid = Process.pid 

# Get the child pids. 
pipe = IO.popen("ps -ef | grep #{pid}") 

child_pids = pipe.readlines.map do |line| 
    parts = line.split(/\s+/) 
    parts[2] if parts[3] == pid.to_s and parts[2] != pipe.pid.to_s 
end.compact 

# Show the child processes. 
puts child_pids 

의 라인을 따라 뭔가 될 것입니다.

+1

'Process.pid'는 부모 프로세스가 아닌 현재 프로세스의 PID를 반환한다. 부모 프로세스 pid를 얻으려면,'Process.ppid'를 실행하십시오. – henrikhodne

+0

현재 프로세스가 필요한 주석에 오류가 있습니다. 자식 프로세스의 부모가됩니다. – Jamie

+5

몇 센트 : "ps o pid = --ppid # {pid}"는 "ps -ef | grep # {pid}"보다 편리 할 수 ​​있으므로이 경우 불필요한 행과 필드를 걸러 낼 필요가 없습니다 . – timurb

6

Process.fork은 스폰 된 자식의 PID로 응답합니다. 자녀를 태어나는 동안 배열에서 계속 추적하십시오. http://ruby-doc.org/core/classes/Process.html#M003148을 참조하십시오.

+0

좋은 변형이 될 수 있지만 제 경우에는 블록을 생성하는 방법이 있고 fork, system, spawn, backtrick 및 pid 카운터를 통해 해당 메서드를 연결하는 모든 호출을 추적하는 유일한 방법이 있습니다. children pids를 얻는 더 쉬운 방법이있다. – tig

2

sys-proctable 보석을 사용하여 수행 할 수 있습니다 :이 실제로 조용 복잡하고 특정 플랫폼이다

require 'sys/proctable' 

Sys::ProcTable.ps.select{ |pe| pe.ppid == $$ } 
0

. 실제로 이 의도적으로 숨기려고하면 모든 하위 프로세스를 찾을 수 없습니다.

스폰 된 프로세스를 그냥 죽이고 싶다면 많은 옵션이 있습니다. 테스트 프레임 워크의 경우 다음 두 가지를 선택했습니다. 1. pgid => true 으로 프로세스를 생성합니다. 2. 변수 MY_CUSTOM_COOKIE=asjdkahf을 삽입하고 해당 쿠키가있는 환경에서 procs를 찾아서 종료합니다.

FYI는 ps을 사용하여 프로세스 계층 구조를 확인하는 것은 매우 신뢰할 수 없습니다. 사슬에서 하나의 프로세스가 종료되면 서브 프로세스는 최소한 1의 부모 PID를 갖습니다 (리눅스에서는 적어도). 따라서 구현할 가치가 없습니다.