`<&-`는 무엇을합니까?


20

Bash 스 니펫을 복사하여 원격으로 실행되는 ssh 명령을 백그라운드로 복사했습니다.

ssh user@remote <<CMD
some process <&- >log 2>error &
CMD

무엇을 <&-합니까?
내 생각 엔 그것이< /dev/null

나의 다음 이해는 세 가지 주요 파일 기술자가 (즉 stdin, stdout, stderr) 방지하기 위해 폐쇄해야합니다 :

  1. 백그라운드에서 작업하고 스크립트가 종료됩니다. 어떻게 든 충돌합니까?
  2. 터미널이 닫히면 터미널에서 stdin을 수락하는 모든 프로세스가 닫힙니 까?

필수 상호 참조 : 셸의 제어 및 리디렉션 연산자 란 무엇입니까?를 참조하십시오 . —이 연산자에 대해 말하는 것은 "파일 디스크립터를 닫거나 복제하는 데 사용할 수있다"는 것이므로 "쉘 매뉴얼의 관련 섹션을 참조하십시오".
G-Man, 'Reinstate

올바르게 호출 ssh -nNT user@remote 'command'하면 비 대화식 SSH 세션이 생성됩니다. 추가] &배경이, 앞에 추가로 nohup받는 command당신의 연결 죽으면 계속 실행합니다.
Mark K Cowan

1
@MarkKCowan man ssh은 -N이 원격 명령 실행을 완전히 비활성화하고 빠른 테스트가이를 지원한다고 제안합니다.
Tom Hunt

예, 역 포트 포워딩에 -nNTR을 사용했습니다. -N과 -R을 무시한 다음 :)
Mark K Cowan

답변:


30

<&-아니다 확실히 같은 것 < /dev/null. <&-fd 0을 닫으 < /dev/null면서 장치에서 리디렉션하므로 /dev/null데이터를 제공하지 않으며 항상 EOF를 읽습니다. 차이점은 대부분 read(2)닫힌 FD ( <&-사례)에서 호출하면 EBADF에서 오류가 발생하지만 null로 리디렉션 된 FD에서 호출하면 읽은 바이트 (파일 끝 조건)가 반환되지 않는다는 것입니다. 프로그램이 stdin에서 읽지 않으면 구별은 중요하지 않습니다.

TTY에서 무언가를 읽으려고하면 백그라운드 프로세스가 중단되므로 FD를 닫는 것이 좋은 방법입니다. 이 예제는 모든 것을 완벽하게 처리하지는 않습니다. 이상적으로 는 백그라운드 프로세스를 완전히 분리하기 위해 어딘가에 nohup또는 setsid호출 이있을 것 입니다.


따라서 nohup파일 설명자를 닫는 것 외에도 사용해야 합니까?
Eric Francis

2
가장 철저한 방법 (프로그램이 자신을 디먼하는 방식을 모방 함)은 다음과 같습니다 setsid some process <&- >path/to/log 2>path/to/error. 더 빠른 방법은 다음과 같습니다 nohup some process &.
Tom Hunt

2
@EricFrancis : nohup여기서는 말이되지 않습니다. 제어 터미널이 닫힐 때 nohup프로세스가 HUP신호 를 수신하지 못하도록합니다 . 그러나이 경우 터미널이 없었습니다.
cuonglm

@TomHunt : 백그라운드 프로세스가 멈추지 않았고 ssh 세션이 중단되었습니다.
cuonglm

2
fds 0, 1 & 2를 닫는 것은 좋은 생각이 아닙니다 ... 다음 fd가 그 값 중 하나를 차지하기를 원하지 않습니다. 더 잘 리디렉션을을 / dev / null
머레이 젠슨

7

참조 man bash:

  [n]<&word

입력 파일 디스크립터를 복제하는 데 사용됩니다. word하나 이상의 숫자로 확장 되면 로 표시된 파일 디스크립터 n는 해당 파일 디스크립터의 사본이됩니다. 숫자가 word 입력을 위해 열린 파일 디스크립터를 지정하지 않으면 경로 재 지정 오류가 발생합니다. 단어가로 평가 -되면 파일 설명자가 n닫힙니다. 경우 n지정하지 않으면 표준 입력 (파일 기술자 0)가 사용됩니다.


올바른 정의는 당신이 가지고 [n]<&word있고 단어가 두 자리 이상을 포함 할 때 발생하는 것이 지정되지 않았다는 것입니다 .
schily

무슨 소리 야? 인가 man bash잘못?
에릭 프랜시스

@EricFrancis는 표준에 명시되어 있지 않기 때문에 bash, 제정신 방식으로 구현하도록 선택합니다 ( "sane"의 적절한 정의를 위해). 다른 껍질은 그렇지 않을 수도 있습니다.
muru

@muru 질문에 태그 bash가 없습니다 posix-shell.
Barmar

@Barmar ok. 그래서...?
muru

7

<&- 표준 입력을 닫습니다.

POSIX에 의해 정의 된 일반적인 형태가 있다 :

[n]<&word

파일 디스크립터의 목적 n은로 표시된 파일 디스크립터의 사본입니다 word. 를 n생략 하면 표준 입력이 가정 되고 wordis -인 경우 파일 설명자가 n닫힙니다.

</dev/null경우 </dev/null표준 입력이 여전히 열려 있고 다른 위치로 리디렉션 되었기 때문에 와 동일하지 않습니다 .

ssh 소켓에 연결된 프로세스의 모든 파일 디스크립터를 닫아야합니다. 그렇지 않으면 ssh 세션을 닫을 수 없습니다.

screen 또는 tmux 를 사용하여 ssh 세션에 연결하지 않고 원격 시스템에서 명령을 실행할 수 있습니다 .

ssh user@remote 'screen -S test -d -m command'

왜 다운 투표?
cuonglm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.