2011-08-21 2 views
1

sh에서 원래 프로세스와 다른 프로세스를 실행하는 방법을 테스트하고 있습니다. 나는 이미 자식 프로세스를 스폰하기 위해 &이 사용되었다고 들었습니다. 프로그램을 호출하여,이 경우에는 glxgears입니다. STDOUT이 너무 많아서 (그래서 출력이 어디로가는 지 테스트 할 수 있습니다.) 백틱을 사용합니다.Bourne Shell (또는 csh)에서 완전히 분리 된 프로세스를 생성하는 데 사용할 수있는 것

glxgears& 

`glxgears`& 

comp:~ user$ `glxgears`& 
[1] 14511 
comp:~ user$ X connection to /tmp/launch-dZalNv/org.x:0 broken (explicit kill or server shutdown). 

[1]+ Exit 1     `glxgears` 
comp:~ user$ 

원인이 어디 [1] 14511 적절한 프로세스 시작에 불과 통지 것을 받아 현재 쉘에서 출력을 유지하지만, 어떻게하지 않습니다 X 서버 여전히 내 쉘에서 출력을 덤프 할 수 있습니까? 내가 시작했습니다 경우 왜 별도의 프로세스가

[1]+ Exit 1     `glxgears` 

가 표시인가? 쉘은 절대로 다른 닫는 프로세스를 경고하지 않습니다!

쉘이 닫힌 후에도 내 쉘의 PID로 남아있는 프로세스 그룹과 관련이 있다고 추측했습니다. 다른 모든 프로세스에는 자체 프로세스 그룹이 있습니다. 심지어

`glxgears&`& 

프로세스 그룹으로 원래의 쉘의 PID를 유지

를 사용!

나는 어떤 종류의 출력도 시작 셸에 어떤 관련도없이 프로그램 (이 경우 glxgears)을 실행할 수 있기를 원합니다.

또한 X 서버가 내 시작 프로세스를 보낼 수있는 이유를 설명 할 수 있으면 매우 높이 평가할 수 있습니다.

+0

제쳐두고, 그건 당신이 백틱을 사용하는 것이 아닙니다.프로세스가 일부 출력을 생성하면 쉘은 실행할 첫 번째 단어를 명령 이름으로 사용하려고 시도합니다. 보라 :'\'echo moo \''-> sh : moo : 명령을 찾을 수 없다. – tripleee

답변

3

이 시도 :

nohup glxgears >/dev/null 2>&1 & 
  • 2>&1 프로그램의 표준 에러를 표준 출력 할 수 있습니다.
  • >/dev/null는 터미널에 아무것도 볼 수 있도록 표준 출력은/널/dev에있을 수 있습니다, 당신이 종료되면 프로그램은 프로그램이 있다면 종료되지 않습니다 터미널
  • nohup와 BOKEN 파이프 신호를받을 수 없습니다 해당 부모가 종료되었습니다.
+2

프로세스가 완전히 독립적 인 ('init' 프로세스의 하위) 프로세스가되기보다는 괄호 안에 넣는다. 쉘 프로세스. –

+0

하지만 왜 STDERR/STDOUT이고 여전히 부모 프로세스 쉘로 덤프되어 있습니다 (지금까지 내가 말할 수있는 한). 출력을 쉘에 버리지 않고 실행할 수 있습니까? 시작 셸에서 출력되는 이유는 무엇입니까? – Hawken

+0

stdout은 프로그램이 보통의 출력을 쓰는 곳입니다. 일반적으로 쉘입니다. stderr는 오류를 출력하는 곳이며, 쉘이기도합니다. ''glxgears''에서는 에러가 아닌 정상적인 출력 만 캡처합니다. – arnaud576875

1

I/O 스트림과의 프로세스 연결이 혼동스러워 보입니다. 백그라운드 프로세스에 대한 유일한 특별한 점은 대화 형 제어를 호출 셸에 반환한다는 것입니다. 그들은 여전히 ​​동일한 터미널의 동일한 stdout 및 stderr 스트림을 사용합니다. 그 밖에 어디에서 출력을 씁니까? 반 합리적인 일은 (a) 출력물을 완전히 버리고 (b) 새로운 파일을 가리 키도록하는 것입니다. 두 가지 모두 기본 동작으로는 유용하지 않을 것으로 간주되었으므로 기본값은 여전히 ​​호출 프로세스의 터미널을 출력용으로 사용합니다. arnaud에 표시된대로 > 연산자로이 선택 사항을 무시할 수 있습니다.

+0

하지만 ** init **의 하위가 된 후에 프로세스가 부모 프로세스 초기화가 아닌 프로세스 그룹에 여전히 STDERR을 전송하는 이유는 무엇입니까? – Hawken

+0

매우 가능성이 높기 때문에 init에는 터미널이 연결되어 있지 않으므로 출력이 사라집니다. 출력을 상위 터미널로 라우팅하는 것이 더 좋습니다. 원하는 값을 얻었 으면 좋겠지 만 무시할 수는 있습니다. 그러나 값을 얻지 않고 원하는 값으로 설정하면 운이 없게됩니다. –

관련 문제