백그라운드에서 원격으로 ssh 명령을 실행하기 위해 Bash 섹션을 복사했습니다.
ssh user@remote <<CMD
some process <&- >log 2>error &
CMD
<&-
효과 는 무엇입니까 ?
내 추측으로는 뭔가 관련이 있는 것 같아< /dev/null
다음 이해는 다음을 방지하기 위해 세 가지 주요 파일 설명자( stdin
, stdout
, )를 닫아야 한다는 것입니다.stderr
- 백그라운드에서 실행 중인 작업과 스크립트 종료 중 충돌이 발생합니까?
- 터미널이 닫히면 터미널에서 stdin을 수신하는 모든 프로세스가 닫히나요?
답변1
<&-
아니요상당히.< /dev/null
<&-
fd 0을 닫습니다. < /dev/null
device에서 리디렉션하는 동안 /dev/null
데이터를 제공하지 않으며 읽기 시 항상 EOF를 제공합니다. 주요 차이점은 read(2)
닫힌 FD(이 <&-
경우)의 호출은 EBADF 오류를 발생시키는 반면, 빈 리디렉션 FD의 호출은 읽은 바이트(파일 끝 조건)를 반환하지 않는다는 것입니다. 프로그램이 표준 입력에서 데이터를 읽지 않는다면 차이는 중요하지 않습니다.
백그라운드에서 무언가를 실행하려면 FD를 끄는 것이 좋습니다. 왜냐하면 백그라운드 프로세스가 TTY에서 무엇이든 읽으려고 하면 중단되기 때문입니다. 하지만 이 예제는 필요한 모든 것을 처리하지는 않지만 이상적으로는 백그라운드 프로세스를 완전히 분리하기 위해 어딘가에 nohup
OR 호출이 있을 것입니다.setsid
답변2
바라보다 man bash
:
[n]<&word
입력 파일 설명자를 복사하는 데 사용됩니다.
word
하나 이상의 숫자로 확장 되면 표시된 파일 설명자는n
해당 파일 설명자의 복사본이 됩니다. 숫자가word
입력을 위해 열린 파일 설명자를 지정하지 않으면 리디렉션 오류가 발생합니다. word가 로 평가되면-
파일 설명자가n
닫힙니다. 지정하지 않으면n
표준 입력(파일 설명자 0)이 사용됩니다.
답변3
<&-
표준 입력을 닫습니다.
이것POSIX에서 정의한 일반 형식, 예:
[n]<&word
파일 설명자가 생성된 목적은 n
파일 설명자의 복사본으로 표시됩니다 word
. 생략 하면 n
표준 입력으로 가정하고, 그렇다면 word
파일 -
설명자가 n
닫힙니다.
</dev/null
의 경우 </dev/null
표준 입력이 여전히 열려 있고 다른 곳으로 리디렉션된다는 점 에서 다릅니다 .
SSH 소켓에 연결된 프로세스의 모든 파일 설명자를 닫아야 합니다. 그렇지 않으면 SSH 세션을 닫을 수 없습니다.
다음을 사용하여 SSH 세션에 연결하지 않고도 원격 시스템에서 명령을 실행할 수 있습니다.화면또는멀티플렉서:
ssh user@remote 'screen -S test -d -m command'