2017-05-20 1 views
0

일부 서버에 ssh가있는 스크립트가 있습니다. 경우에 따라 예기치 않은 문제로 인해 ssh가 무기한 중지됩니다. 나는 너무 오래 실행하면 ssh를 죽임으로써 이것을 피하고 싶다.bash 스크립트에서 SSH -t와 함께 GNU 시간 초과를 사용하여 걸려 내기 방지

또한 입력 리디렉션을위한 래퍼 기능을 사용하고 있습니다. 서버에서 프로세스를 행복하게 만들려면 -t 플래그와 함께 tty를 강제해야합니다.

tcsetattr: Interrupted system call 

예상 결과가 어느 원격 쉘 명령의 출력 또는 초과하고 적절한 종료 코드이다

function _redirect { 
    if [ "$DEBUG" -eq 0 ]; then 
     $* 1> /dev/null 2>&1 
    else 
     $* 
    fi 
    return $? 
exit 
} 
SSH_CMD="ssh -t -o BatchMode=yes -l robot" 
SERVER="192.168.1.2" 
ssh_script=$(cat <<EOF 
sudo flock -w 60 -n /path/to/lock -c /path/to/some_golang_binary 
EOF 
) 

_redirect timeout 1m $SSH_CMD $SERVER "($ssh_script)" 

결과 인쇄 된 메시지와 타임 아웃이다. 내가

timeout 1m ssh -t -o BatchMode=yes -o -l robot 192.168.1.2 \ 
    "(sudo sudo flock -w 60 -n /path/to/lock -c /path/to/some_golang_binary)" \ 
    1> /dev/null 

를 입력 할 때

내가 예상 결과를 얻을.

1)) 시간이 오래 걸릴 (또는 정지 할 tcsetattr이 시스템 호출의 원인이되는 GNU 시간 제한 및 SSH 사이의 상호 작용은 다음 시간 제한이 그것을 방해하는 SIGTERM을 보냅니다

나는이 두 가지를 생각한다 그 메시지를 출력합니다. 이 호출이 수행 된 첫 번째 작업 중 하나이기 때문에 다른 출력이 없습니다. 시간 초과가 터미널을 가질 수없는 자식 프로세스에서 ssh를 시작한 다음 주 프로세스를 사용하여 시간을 계산하고 그 자식을 죽이는 지 궁금합니다.

이 호출이 실패 할 수있는 이유로 here으로 보았습니다.

2) _redirect는 [email protected], $*, "[email protected]", "$*" 등의 다른 하나가 필요합니다. 일부 잘못된 이스케이프/매개 변수 변경은이 tcsetattr 오류의 원인이되는 시간 초과로 인수를 나눕니다. 이것의 다양한 조합을 시도해도 아직 문제가 해결되지 않았습니다.

답변

0

해결 된 것은 --foreground 플래그가 시간 초과되었습니다.

관련 문제