문제

나는 오랫동안 진행되는 프로세스가 있으며 다른 프로세스를 시작해야합니다 (좋은 시간에도 실행될 것입니다). 나는 그것을 시작한 다음 그것을 완전히 잊어 버리면됩니다.

나는 프로그래밍 루비 책에서 코드를 퍼 내면서 필요한 일을했지만 최상의/올바른 방법을 찾고 무슨 일이 일어나고 있는지 이해하고 싶습니다. 처음에 내가 얻은 것은 다음과 같습니다.

exec("whatever --take-very-long") if fork.nil?
Process.detach($$)


그래서 이것이 방법입니까, 아니면 어떻게해야합니까?

아래의 답변을 확인한 후이 코드로 끝났는데 더 의미가있는 것 같습니다.

(pid = fork) ? Process.detach(pid) : exec("foo")


방법에 대한 설명에 감사드립니다 fork 공장. [이미 얻었다

분리하고 있었다 $$ 오른쪽? 나는 이것이 왜 작동하는지 모르겠다. 그리고 나는 상황을 더 잘 이해하고 싶다.

도움이 되었습니까?

해결책

그만큼 fork 기능은 프로세스를 둘로 분리합니다.

둘 다 프로세스는 기능의 결과를 수신합니다. 아이는 0/의 값을받습니다.nil (따라서 그것이 자녀라는 것을 알고 있습니다) 부모는 자녀의 PID를받습니다.

따라서:

exec("something") if fork.nil?

아동 과정이 "무언가"를 시작하게 할 것이며, 부모 과정은 어디에서 진행될 것입니다.

주목하십시오 exec() 대체 "무언가"가있는 현재 프로세스이므로 하위 프로세스는 후속 루비 코드를 실행하지 않습니다.

전화 Process.detach() 잘못된 것 같습니다. 나는 그것이 아이의 PID를 가지고있을 것으로 예상했을 것입니다. 그러나 당신의 코드를 올바르게 읽으면 실제로 부모 과정을 분리하는 것입니다.

다른 팁

알 니 타크가 옳습니다. 다음은 $$없이 그것을 쓰는 더 명백한 방법입니다.

pid = Process.fork
if pid.nil? then
  # In child
  exec "whatever --take-very-long"
else
  # In parent
  Process.detach(pid)
end

분리의 목적은 단지 "아이가 종료 될 때 상관하지 않습니다"라고 말하는 것입니다. 좀비 프로세스.

분리 $$ 옳지 않았습니다. p. PICKAXE의 348 (제 2 판) :

$$ FixNum 실행중인 프로그램의 프로세스 번호입니다. [R/O

이 섹션 인 "Ruby Language"장의 "변수 및 상수"는 다양한 Ruby Short를 해독하는 데 매우 편리합니다. $ 상수 - 그러나 온라인 판 (첫 번째

그래서 당신이 실제로하고 있던 일은 자녀가 아닌 프로그램 자체를 분리하는 것이 었습니다. 다른 사람들이 말했듯이, 아이를 분리하는 올바른 방법은 아이의 PID를 사용하는 것입니다. fork().

아동 과정을 분리하고 싶다고 확신한다면 다른 대답은 좋습니다. 그러나 신경 쓰지 않거나 자식 프로세스를 첨부하기를 선호하는 경우 (예 : 웹 앱의 하위 서버/서비스를 시작하는 것) 다음 속도를 활용할 수 있습니다.

fork do
    exec('whatever --option-flag')
end

블록을 제공하면 Fork에게 부모를 계속하면서 아동 프로세스에서 해당 블록 (및 해당 블록 만)을 실행하도록 지시합니다.

위의 답변이 터미널을 깨뜨리고 출력을 엉망으로 만들었습니다. 이것은 내가 찾은 해결책입니다.

   system("nohup ./test.sh &")

누구나 같은 문제를 겪을 경우 내 목표는 SSH 서버에 로그인 한 다음 해당 프로세스를 무기한으로 유지하는 것이 었습니다. 그래서 test.sh는 이것입니다

#!/usr/bin/expect -f
spawn ssh host -l admin -i cloudkey  
expect "pass"
send "superpass\r"
sleep 1000000
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top