2012-09-28 7 views
8

ssh를 통해 원격 기계에서 nohup을 사용하여 프로세스를 시작하고 싶습니다. 문제는 nohup으로 시작된 프로세스의 PID를 얻는 방법입니다. 그래서 "프로세스는 실제로 뭔가를하고 있습니다", 어떤 외부 쉘 인스턴스가 아닙니다. 또한, 나는 파일의 표준 출력과 표준 에러를 저장하려면,하지만 "그것은 명령의 정확한 PID 나를 메아리되어이 완벽하게nohup으로 시작한 프로세스의 PID를 ssh를 통해 얻습니다.

nohup sleep 30 > out 2> err < /dev/null & echo $! 

을 사용하여 작동, 로컬 ... 여기

문제 아니다 sleep 30 ","top "또는"ps aux | grep sleep "을 사용할 수도 있습니다.

하지만 SSH를 통해 원격으로 수행하는 데 문제가 있습니다. 나는 같은 것을 시도했다

ssh remote_machine 'nohup bash -c "((sleep 30) &)" > out 2> err < /dev/null' 

그러나 나는 어디에 "echo $!" 그래서 내 로컬 쉘에 표시됩니다. 항상 잘못된 PID를 보여줍니다. 예를 들어 "bash"인스턴스 등.

이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

편집 : OK, "bash -c"는 여기에 필요하지 않을 수 있습니다. Lotharyx 지적처럼, 나는 바로 PID가 잘

ssh remote 'nohup sleep 30 > out 2> err < /dev/null & echo $!' 

하지만 다음 문제는 생산 뭔가 "잠 30"를 대체 할 경우 출력, 말, "안녕하세요 에코!"고, 그 출력을 사용하여 얻을 파일에서 "out"으로 끝나는 것이 아니라 로컬 또는 원격 측에서 수행됩니다. 왜 아무 생각 없어?

EDIT2 : 내 잘못! 다른 장치에 공간이 남아 있지 않아 "out"과 "err"파일이 비어 있습니다.

이렇게 작동하고 있습니다. (;) 하나가 세미콜론으로 구분, 행에 여러 명령을 호출하고자하는 경우 또한, 하나는 여전히 같은 "bash는 -c"사용할 수 있습니다

ssh remote 'nohup bash -c "echo bla;sleep 30;echo blupp" > out 2> err < /dev/null & echo $!' 

를 그 다음이의 PID를 출력 "bash -c"는 로컬 측에 있습니다. 괜찮습니다. (모든 프로그램 자체가 새로운 서브 프로세스를 생성 할 수 있기 때문에 찾을 수있는 방법이 없습니다 ...)

답변

8

다음을 시도했습니다 (로컬

원격 시스템에서
 
    ~# ssh [email protected] 'nohup sleep 30 > out 2> err < /dev/null & echo $!' 
    [email protected]'s password: 
    14193 
    ~# 

, 내가 추신 -e 않았고,이 줄을 보았다 :

 
    14193 ?  00:00:00 sleep 
를 원격 장치)에 CentOS이며, 그것은 당신이 기다리고있어 생각대로 정확하게 일; 기계는 데비안입니다

내 로컬 컴퓨터에서 출력은 원격 컴퓨터에서 실행되는 "절전 모드"의 PID입니다.

왜 SSH 터널을 통해 명령을 보낼 때 명령에 bash를 추가하고 있습니까?

+0

흠, 당신 말이 맞지만 여전히 stdout에 문제가있는 것 같습니다. 예를 들어, "sleep 30"을 "echo Hello World!"와 같은 출력을 생성하는 것으로 대체하면 "out"파일로 끝나지 않고 PID와 마찬가지로 나에게 반환됩니다. –

+0

"echo foo; sleep 30; echo bar"와 같이 여러 명령을 연속적으로 실행하기 때문에 "bash -c"를 추가 한 것 같습니다. –

+0

내 잘못, 당신의 솔루션은 절대적으로 작동합니다! –