여러 첨자를 가져올 때 스크립트 오류로 인해 SSH 세션이 종료되었습니다.

여러 첨자를 가져올 때 스크립트 오류로 인해 SSH 세션이 종료되었습니다.

내 서버의 SSH에 문제가 있습니다. 개별 스크립트(소스 s01.sh 등)를 실행하면 제대로 작동하고 콘솔에 오류가 표시됩니다. 그러나 기본 스크립트를 사용하여 이러한 스크립트를 얻을 때 오류가 발생하면 SSH 연결이 예기치 않게 종료됩니다. 주요 스크립트 master.sh는 다음과 같습니다.

#!/bin/bash
set -e

source s01.sh
source s02.sh
Rscript s03.R
source s04.sh

대화형 SSH 세션에서 다음 명령을 사용하여 기본 스크립트를 얻습니다.

source master.sh

set -e를 사용하면 오류 발생 시 스크립트가 중지될 것으로 예상했지만 대신 전체 SSH 세션이 중단되었습니다. 이는 개별 구매가 아닌 통합 스크립트에서만 발생합니다. 왜 이런 일이 발생합니까? 스크립트 오류로 인해 SSH 세션이 닫히는 것을 방지하는 방법은 무엇입니까?

여기에 SSH 서버 구성이 포함될 수 있다는 것을 알고 있지만 어떤 설정을 조사해야 할지 잘 모르겠습니다.

답변1

이런 일이 발생하는 이유는 기본 스크립트를 소싱하기 때문입니다. 다음 두 가지 장난감 예제를 사용하여 설명하는 동작을 재현할 수 있습니다.

terdon@oregano ~ $ cat ~/scripts/foo.sh
#!/bin/bash
set -e
source /home/terdon/scripts/bar.sh
echo "done!"

terdon@oregano ~ $ cat ~/scripts/bar.sh
#!/bin/bash

echo "start"
false

이제 새 터미널을 열고 실행하면 . ~/scripts/foo.sh(이것은 source표준 명령의 이식 불가능한 bash 별칭이므로 .. foo동일 source foo), 내가 연 터미널이 종료됩니다. SSH 세션에서 시도하면 SSH 세션이 종료됩니다. 왜? 구매는 명령을 실행하고 현재 세션에 적용하는 것을 의미하기 때문입니다. 따라서 스크립트 중 하나가 오류를 발생시키므로(명령이 false종료됨 1) set -e세션이 종료됩니다 . 명령을 실행하는 대신 명령을 가져와 현재 셸 세션에 적용하라고 지시했기 때문에 스크립트를 종료하는 것만이 아닙니다.

그러나 귀하의 예에서는 기본 스크립트를 가져올 필요가 없는 것 같습니다. 필요한 것은 R 스크립트에 필요한 환경을 설정할 수 있는 다른 스크립트를 가져오는 것뿐입니다. 따라서 조달 대신 실행하면 괜찮을 것입니다.

/path/to/master.sh

또는 아직 실행 가능하게 만들지 않은 경우:

bash /path/to/master.sh

바라보다이 게시물조달 및 이행에 대해 자세히 알아보세요.

관련 정보