2012-03-29 3 views
7

Capistrano 작업 (백그라운드에서 데몬을 시작하려고 시도한 작업)이 걸려있는 이유를 알아 내려고 시도한 결과,을 ssh에서 bash로 사용하면 후속 프로그램이 배경. 나는 bash 4.1.5와 4.2.20에서 그것을 시도했다.bash && 연산자가 ssh를 통한 배경 지우기를 방지합니다.

다음은 bash는 (sleep가 끝날 때까지 즉, 대기) 중단됩니다 :

ssh localhost "cd /tmp && nohup sleep 10 >/dev/null 2>&1 &" 

다음은하지 않습니다 :

ssh localhost "cd /tmp ; nohup sleep 10 >/dev/null 2>&1 &" 

어느 쪽도하지 않습니다이 :

cd /tmp && nohup sleep 10 >/dev/null 2>&1 & 

zsh와 dash는 모두 &&에 관계없이 모든 경우 백그라운드에서 실행됩니다. 및 ssh. bash 또는 버그에 대한 정상/예상 동작입니까?

+1

내가 정확하게 귀하의 질문에 대한 답을 모른다, 그러나 것 원격지에서 Bash를 사용하면서 SSH를 사용할 때 가끔 비슷한 자극을 받았다고합니다. 나는 문제가 Bash에 특화되어 있는지 알지 못하지만, 때때로'nohup' 명령보다는 Bash 쉘의'disown' 내장 명령을 사용하여 더 나은 행운을 얻었습니다. 관심이 있다면'help disown | 배쉬 (Bash)를 실행하는 동안 '덜'. 그리고 일반적인 해결책을 배웠다면 여기에 게시하십시오. 나는 관심을 가져야한다. – thb

+0

나는'disown','nohup'과 리다이렉션의 다양한 조합으로 무차별 적으로 시도했다. '&&'는 항상 배경을 금지합니다. 서브 쉘에서 두 명령을 묶는 방법으로 도망 갈 수는 있지만 실제로 같은 것은 아닙니다. – Hinrik

+0

명령이 나를 위해 작동하는 것 같습니다. 매달리는 것의 의미는 무엇입니까? 'cd'는 오랜 시간이 걸립니까? 원격 서버와 관련된 문제 일 수 있습니다 (예 : 너무 많은 짐. – suvayu

답변

4

하나 개 쉬운 솔루션을 사용하는 것입니다

ssh localhost "(cd /tmp && nohup sleep 10) >/dev/null 2>&1 &" 

(이 또한 괄호를 사용하는 경우, 아래의 두 번째 예제를 참조 작동).

필자는 더 이상 실험하지는 않았지만 열린 파일 설명자를 사용하는 것이 합리적이라고 확신합니다. bash는

{ cd /tmp && nohup sleep 10; } >/dev/null 2>&1 

:이 같은 철자하는 것을 의미하므로 아마도 zsh을하고 대시는 &&을 결합한다.


아니요, 대시에서 빠른 실험은 echo foo && echo bar >file이 후자를 리디렉션한다는 것을 보여줍니다. 아직도 느린 오픈 fd로 인해 ssh가 더 많은 출력을 기다리는 것과 관련이 있습니다. 나는 과거에 많은 것을 경험했습니다.
이 특별한 경우에 괄호 나 중괄호를 사용하는 경우에는 하나의 트릭이 필요하지 않지만 &&과 관련된 명령 집합이 더 복잡한 일반 상황에서는 유용 할 수 있습니다. bash는 파일 설명자에 &&으로 부적절하게 매달려 있지만, ;으로는 매달려 있지 않으므로 a && b && ca || exit 1; b || exit 1; c으로 설정할 수 있습니다. 이 테스트 케이스와 함께 작동 :

ssh localhost "true || exit 1; echo going on; nohup sleep 10 >/dev/null 2>&1 &" 

falsetrue와 "가는"생략의 에코를 교체합니다.

+0

그래,'&&'로'|| exit 1;은 확실히 사용할 해결 방법입니다. – Hinrik

1

이것은 작동하는 것 같다 (가끔 원하는 것보다 더 큰 망치하지만 당신은 또한 set -e 수 있습니다.) :

ssh localhost "(exec 0>&- ; exec 1>&-; exec 2>&-; cd /tmp; sleep 20&)" 
+1

모든 디스크립터를 앞에 닫는 단점은 오류 메시지를 원래 ('ssh') 호스트로 다시 보낼 수 없다는 것입니다. – torek

관련 문제