원격 PC에서 서비스 실행을 모니터링하고 그 결과에 따라 기능을 실행하려고 합니다. 따라서 함수는 다음과 같아야 합니다.
- 서비스 "X"가 시스템 1에서 실행 중인 경우 시스템 2에서는 아무 것도 수행하지 마십시오.
- 서비스 "X"가 다음과 같은 경우실행되지 않음시스템 1에서 시스템 2의 서비스 "Y"를 시작합니다.
pgrep
그래서 다음과 같이 사용하고 싶습니다 .ssh
ssh [email protected] pgrep -x "service"
위 명령줄을 실행하는 동안 두 시스템 간의 연결이 끊어지면 스크립트가 중단됩니다. 실행 전에 연결이 끊어지면 예상되는 오류와 함께 실패합니다.
-o ConnectTimeout=1
연결이 끊어졌을 때 SSH 연결이 설정되었기 때문에 ssh를 실행해도 문제가 해결되지 않았습니다.
결국 연결이 끊어지고 스크립트가 추가로 실행될 것으로 예상됩니다. 그러나 몇 분이 지나도 원격으로 실행되는 명령에 대해 스크립트가 중단됩니다.
답변1
SSH 클라이언트가 원격 시스템의 SSH 서버로부터 연결 끊김을 감지하는 데 도움이 되도록 설계된 두 가지 SSH 구성 옵션이 있습니다. 그들은 -o ServerAliveInterval=15
과 입니다 -o ServerAliveCountMax=3
. 간격은 클라이언트가 서버(원격 컴퓨터)로부터 응답을 요청하는 프로브 사이의 초 수이며, 최대 개수는 클라이언트가 연결이 끊어졌음을 확인하기 위한 연속 실패 횟수입니다.
클라이언트가 문제를 감지하고 세션을 종료하는 데(오류 코드를 스크립트에 반환하는 데) 약 45초가 걸립니다. 최대 개수를 0(기본값)으로 설정하면 문제를 감지하기 위한 프로브가 전송되지 않으며 10분 이상 걸릴 수 있습니다.
제 생각에는 이 조합을 45초 미만으로 설정하면 연결이 끊어졌을 때보다 네트워크가 느릴 때 SSH 클라이언트의 연결이 조기에 끊어지고 모니터링이 중단될 위험이 높아집니다. 간격을 60~120초보다 길게 설정하면 방화벽과 같은 네트워크 장치가 유휴 연결을 끊는 대신(연결을 중단하는 대신) 연결을 끊을 위험이 있습니다.
TCPKeepAlive
(이 옵션은 끊어진 연결을 감지하거나 연결을 유지하는 옵션만큼 유용하지 않기 때문에 논의하지 않았습니다 ServerAlive*
.)
답변2
다음 명령을 사용하여 시간이 제한된 컨텍스트로 timeout
래핑 할 수 있습니다 .ssh
pid=$(timeout 10s ssh -n [email protected] 'pgrep -x service' 2>/dev/null)
ss=$?
case "$ss" in
124) echo "Timeout" >&2 ;;
1[23?) echo "Something went badly wrong ($ss)" >&2 ;;
0) echo "All is well" >&2 ;;
*) echo "An error occurred with the remote execution ($ss)" >&2 ;;
esac
if [ -z "$pid" ]
then
echo "No result from ssh pgrep" >&2
fi
문서( man timeout
)에서는 기간을 "선택적 접미사가 있는 부동 소수점 숫자: s
초(기본값), m
분, h
시간 또는 d
일.".