2016-09-15 9 views
5

자체를 배경에 넣는 명령을 실행하고 싶습니다 (또는 가능하면 명령을 포어 그라운드 모드로 실행하고 직접 백그라운드로 실행하십시오). 그리고 pid를 얻으십시오 배경 과정. 어떻게 Go에서이 작업을 수행합니까? 즉시 ~golang exec 백그라운드 프로세스와 그 pid를 얻으십시오

cmd := exec.Command("ssh", "-i", keyFile, "-o", "ExitOnForwardFailure yes", "-fqnNTL", fmt.Sprintf("%d:127.0.0.1:%d", port, port), fmt.Sprintf("%[email protected]%s", serverUser, serverIP)) 
cmd.Start() 
pid := cmd.Process.Pid 
cmd.Wait() 

이 반환 백그라운드에서 실행 ssh를 잎하지만 PID는 실행중인 ssh를 프로세스의 PID 아니다 (이 갈래 전에 부모 ssh를 프로세스의 아마 그것 PID 및 자체를 백그라운드로) : 내가 시도 .

어떻게 올바르게 수행 할 수 있습니까?

+0

"배경"이란 무엇을 의미합니까? 'Cmd'를'Start()'할 때 Go 어플리케이션과 동시에 실행되는 별도의 자식 프로세스 (적절한'Process.Pid'와 함께)가 있습니다. 아마도 ssh 플래그에서'-f'를 제거 할 필요가 있을까요? –

+1

이동 프로세스가 종료 된 후에도 프로세스를 계속 실행해야합니다. 나는 그후 pid를 저장해야 할 미래의 ssh 프로세스를 죽일 수 있어야한다. – sbs

+0

흠, 사실 당신 말이 맞아요. 내가 그걸 기다리지 않고 그냥 나가면 프로세스가 계속됩니다. – sbs

답변

9

특별한 것은 필요 없지만 ssh에 배경을 밝히지 말고 Wait()을 입력하십시오. 예 :

$ cat script.sh 
#!/bin/sh 
sleep 1 
echo "I'm the script with pid $$" 
for i in 1 2 3; do 
     sleep 1 
     echo "Still running $$" 
done 
$ cat proc.go 
package main 

import (
     "log" 
     "os" 
     "os/exec" 
) 

func main() { 
    cmd := exec.Command("./script.sh") 
    cmd.Stdout = os.Stdout 
    err := cmd.Start() 
    if err != nil { 
     log.Fatal(err) 
    } 
    log.Printf("Just ran subprocess %d, exiting\n", cmd.Process.Pid) 
} 
$ go run proc.go 
2016/09/15 17:01:03 Just ran subprocess 3794, exiting 
$ I'm the script with pid 3794 
Still running 3794 
Still running 3794 
Still running 3794 
+0

안녕하세요, 예제가 올바르게 작동하고 있지만 프로세스가 완료되면 'S'모드가됩니다. 동일한 결과를 얻는 더 좋은 방법이 있습니까? 내가 끝나면 확인을 위해 pid를 얻을 수 있습니다. 내 경우에는 성공적으로 완료되면 이미 결과를 포함하는 로그 파일이있을 것이므로 출력이 필요하지 않습니다. –

+0

ssh 연결을 사용하면 더 잘 작동합니까? –