루비에서 필자는 꼬리와 유사하게 파일의 변경 사항을 지속적으로 감시하는 시스템 ("명령")을 운영하고 있습니다. 내 프로그램이 계속 실행되고 system() 호출에서 중단되지 않도록하고 싶습니다. Ruby에서 다른 프로세스를 생성하여 둘 다 독립적으로 실행하고 결과를 터미널에 출력 한 다음 프로그램을 종료하면 생성 된 응용 프로그램이 제거됩니다.루비는 두 개의 프로세스를 실행하여 결과를 터미널에 출력하고 안전하게 종료합니다.
1
A
답변
2
2
당신은 프로세스가 완료 될 때까지 그 기다립니다 system
를 사용하지 않습니다. spawn
대신에 wait을 사용하면 좀비를 피할 수 있습니다. 그런 다음 종료 할 때 생성 된 프로세스에 SIGTERM을 보냅니다. fork
을 사용하여 하위 프로세스를 시작할 수도 있지만 외부 프로그램을 사용하는 경우 spawn
이 더 쉽습니다.
모든 프로세스 ID를 추적하는 대신 프로세스 그룹을 사용할 수도 있습니다. 그러면 단일 Process.kill('TERM', -process_group_id)
호출이 처리 할 수 있습니다. 하위 프로세스는 동일한 프로세스 그룹에 있어야하지만 필요하면 Process.setpgid
이 있어야합니다.
여기에 fork
을 사용하는 예가 있습니다. 모든 패키지를 하나의 패키지로 쉽게 포장 할 수 있습니다.
def launch(id, sleep_for)
pid = Process.fork do
while(true)
puts "#{id}, pgid = #{Process.getpgid(Process.pid())}, pid = #{Process.pid()}"
sleep(sleep_for)
end
end
# No zombie processes please.
Process.wait(pid, Process::WNOHANG)
pid
end
# These just forward the signals to the whole process group and
# then immediately exit.
pgid = Process.getpgid(Process.pid())
Signal.trap('TERM') { Process.kill('TERM', -pgid); exit }
Signal.trap('INT') { Process.kill('INT', -pgid); exit }
launch('a', 5)
launch('b', 3)
while(true)
puts "p, pgid = #{Process.getpgid(Process.pid())}, pid = #{Process.pid()}"
sleep 2
end
당신은 하나 개의 터미널에서 다음 것은 (쉘의 kill
명령을 사용하여) 서로를 죽일 아이들도 사망하는 것을 볼 수 있음을 실행하는 경우. "이 신호를 전체 프로세스 그룹으로 전달"Signal.trap
항목을 제거하면 간단한 SIGTERM은 자식을 계속 실행합니다.
이 모든 것은 사용자가 Unixy 시스템 (예 : Linux 또는 OSX), YMMV 다른 곳에서 작업하고 있다고 가정합니다.
0
스폰을 사용하는 것에 대해 한 번 더 투표하십시오. 우리는 생산에서 많이 사용하고 매우 안정적입니다.
관련 문제
- 1. 스레드가 잠자고있는 동안 프로세스를 종료합니다.
- 2. 프로세스를 실행하고 기다리지 않고 종료합니다.
- 3. 두 개의 쿼리 결과를 병합하십시오.
- 4. Python이 자식 하위 프로세스를 분리하고 분리하고 종료합니다.
- 5. 파이썬은 사용자가 소유 한 모든 프로세스를 종료합니다.
- 6. MacOSX/Windows 지정된 디렉토리에있는 모든 프로세스를 종료합니다.
- 7. 부모가 관리하는 두 개의 하위 프로세스를 만듭니다.
- 8. iPhone - 두 개의 프로세스를 동시에 시작하십시오.
- 9. 코드에서 여러 프로세스를 실행하여 iPhone을 과열하는 방법
- 10. 루비는
- 11. 루비는
- 12. 루비는
- 13. 장고를 배포 할 때 fastcgi 프로세스를 자동 종료합니다.
- 14. 반복 된 powershell 스크립트를 중단하고 원격 프로세스를 종료합니다.
- 15. 안전하게 소프트웨어를 안전하게 닫으려면 어떻게합니까?
- 16. Delphi - 서비스에서 생성 된 프로세스를 정상적으로 종료합니다. (tprocess/createProcess 사용)
- 17. Clojure/Swank`break`가 Leiningen 프로세스를 종료합니다 - 왜?
- 18. 디버깅 루비는
- 19. 두 개의 열을 스칼라로 곱하면
- 20. CreateObject ("InternetExplorer.Application")가 두 개의 iexplorer.exe 프로세스를 만드는 이유는 무엇입니까?
- 21. 어떻게 두 개의 프로세스를 동시에 시작할 수 있습니까?
- 22. 두 개의 개별 파이썬 프로세스를 통신하는 방법은 무엇입니까?
- 23. 두 테이블에 대해 두 개의 쿼리를 실행하여 mysql/php로 하나의 결과 목록을 얻습니다.
- 24. 루비는 "상당"입니다
- 25. 응용 프로그램을 실행하여 두 번째 모니터로 보냅니다.
- 26. 두 개의 다른 테이블에 두 개의 계산 (*) 결과를 함께 추가하려면 어떻게합니까?
- 27. invoke-command에 의해 시작된 원격 작업을 종료합니다.
- 28. Pycurl은 터미널에 계속 인쇄합니다.
- 29. FIFO 내용을 출력하고 종료하십시오.
- 30. PostgreSQL에서 두 개의 하위 쿼리 결과를 결합하는 방법은 무엇입니까?
프로그램이 종료 될 때 모든 하위 프로세스를 종료 하시겠습니까? 아니면 종료하기 전에 아이들이 스스로 끝내기를 기다리시겠습니까? –
은 프로그램이 종료 될 때 모든 하위 프로세스를 종료합니다. 두 프로세스 모두 파일의 변경 사항을 감시하므로 실제로 완료되지 않습니다. – jaysonp