2011-04-08 4 views
6

잘못된 방향으로 접근 할 수 있으므로 도움이 될 것입니다.Ruby에서 독립적 인 스레드 또는 프로세스를 스폰합니다.

저는 Ruby 스크립트를 가지고 있는데, 다른 것들 중에서 실행 파일을 시작합니다. 이 실행 파일을 시작하고 싶습니다. 현재 시스템 ""을 사용하여 실행 중입니다. 그런 다음 스크립트를 계속 진행하십시오. 스크립트가 끝나면 스크립트를 종료하고 실행 파일을 실행 상태로두기를 원합니다.

원래 나는 다음과 같은

# Do some work 
# Start the executable 
system("executable_to_run.exe") 

# Continue working 

했다 그러나 차단 실행 및 시스템 "은"executable_to_run.exe입니다 종료하지 않습니다 실행 파일이

(나는 그것에을 원하지 않는) 실행이 완료 될 때까지

그래서 나는 지금이 스레드가 일의 실행 파일을 실행되는 동안 내 스크립트를 계속 실행할 수 있다는 점에서 잘 작동

# Do some work 
# Start the executable on it's one thread 
Thread.new do 
    system("executable_to_run.exe") 
end 

# Continue working 

이 같은 (대폭 삭감)가 e 배경. 불행히도, 내 스크립트가 종료 될 때 실행 가능한 스레드가 계속 실행 중이며 스레드가 종료 될 때까지 종료되지 않습니다. 실행 파일을 죽이면 스레드가 종료되고 스크립트가 종료됩니다.

그래서 "executable_to_run.exe"를 트리거하고 백그라운드에서 실행되도록 설정하면됩니다.

저는 Windows에서 Ruby 1.8.7을 사용하고 있습니다. 즉, 포크가 구현되지 않았습니다. 내가 먼저 해결해야하는 내부 및 외부 팀 종속성이 있으므로 (그리고 언제든지 완료되지는 않을 것입니다.) 1.9로 업그레이드 할 수 없습니다.

내가

  • '시작' 명령을 통해 프로세스를 실행을 시도했습니다

    하지만 여전히 블록

  • 실행 스레드 에 Thread.kill를 호출
  • 하지만 여전히 이 살해되는 실행 파일을 필요로

그래서 Ruby에서 할 수있는 일이 무엇인가요? 나는 뭔가를 놓치고 있거나 포크를 사용할 수 없기 때문에 문제가 있습니까?

미리 감사

+0

'시작'의 요점 중 하나는 새로운 독립 프로세스를 시작한다는 것입니다. – cHao

+0

Windows가 POSIX 스레드를 올바르게 구현하지 않기 때문에 Ruby 1.8.7은 Windows에서 기본 스레드를 지원하지 않습니다. 너는 이것을 알고 있었다. 이 작업을 수행하는 유일한 방법은 Windows가'system' 호출 내에서 독립적 인 프로세스를 시작하도록 설득하는 것입니다. 이 문제를 해결하려면 Ruby가 아닌 Windows가 필요합니다. –

답변

3

에 난 그냥 시도하고 start 루비 1.8.7와 윈도우 7의 x64에 차단하지 않습니다.

system 'start notepad' 
puts 'Exiting now...' 

이는 분명 Windows 관련 사항입니다.

+1

실행 파일마다 다릅니다. 예를 들어 명령 프롬프트에서 메모장을 실행해도 프로세스가 멈추지 않습니다.NotePad가 시작되지만 명령 프롬프트는 더 많은 명령을 사용할 수있게됩니다. 그러나 명령 프롬프트에서 실행하려는 실행 파일을 실행하면 프로세스가 중단됩니다. –

+0

@Lee Winder -이 동작을 테스트하는 데 사용할 수있는 다른 실행 파일이 있습니까? 왜냐하면 내가 시도한 모든 것은 지금까지 '시작 프로그램'과 함께 작동했기 때문이다. –

4

detunized의 답변은 창에서 작동해야합니다. `system ("executable executable_to_run.exe")`블록이 무언가 엉망이되면, 이것은 크로스 플랫폼입니다 :

pid = spawn 'some_executable' 
Process.detach(pid) #tell the OS we're not interested in the exit status 
+1

나는 산란이 1.9+이었고 1.8.7에서 사용할 수 없다는 인상을 받았다. 확실하게 'spawn'을 사용하여 정의되지 않은 메소드 오류가 발생합니다. –

+1

예, 맞습니다. 1.9입니다. 나는 그 사실을 몰랐다. – steenslag