`<&-`는 무엇을합니까? ssh 명령을 백그라운드로

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

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

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

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

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


답변

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

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


답변

참조 man bash:

  [n]<&word

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


답변

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

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'


답변