나는 마침내 몇 주 동안 어려움을 겪고있는 문제를 해결했습니다. "권한 키"와 함께 SSH를 사용하여 명령을 원격으로 실행합니다. while 루프에서 할 때를 제외하고는 모두 괜찮습니다. ssh 명령으로 반복을 완료하면 루프가 종료됩니다.
오랫동안 나는 이것이 일종의 ksh 기묘하다고 생각했지만 지금은 bash가 실제로 동일하게 작동한다는 것을 알았습니다.
문제를 재현하는 작은 샘플 프로그램. 이것은 스냅 샷을 생성하여 클러스터의 노드간에 복제하는 더 큰 구현에서 나온 것입니다.
#!/bin/bash
set -x
IDTAG=".*zone"
MARKER="mark-$(date +%Y.%m.%d.%H.%M.%S)"
REMOTE_HOST=sol10-target
ZFSPARENT=rpool
ssh $REMOTE_HOST zfs list -t filesystem -rHo name,mounted $ZFSPARENT | grep "/$IDTAG " > /tmp/actionlist
#for RMT_FILESYSTEM in $(cat /tmp/actionlist)
cat /tmp/actionlist | while read RMT_FILESYSTEM ISMOUNTED
do
echo ${RMT_FILESYSTEM}@${MARKER}
[ "$ISMOUNTED" = "yes" ] && ssh $REMOTE_HOST zfs snapshot -r ${RMT_FILESYSTEM}@${MARKER}
echo Remote Command Return Code: $?
done
(zfs list "-H"옵션의 동작 정의에 따라 grep 검색 표현식에 TAB 문자가 있습니다.)
내 샘플에는 루트에 대한 ZFS 파일 시스템이 있습니다. 여기서 모든 "영역"은 다음과 같은 데이터 세트에 루트 파일 시스템이 있습니다.
풀 / 구역 / app1zone
풀 / 구역 / group2 / app2zone
기타
위의 루프는 선택한 각 데이터 세트에 대한 스냅 샷을 작성해야하지만 대신 첫 번째 데이터 세트에서만 작동 한 다음 종료됩니다.
프로그램에서 스크립트가 존재하면 "/ tmp / actionlist"파일을 확인하여 올바른 수의 데이터 세트를 쉽게 확인할 수 있습니다.
ssh 명령이 예를 들어 echo 명령으로 바뀌면 루프는 모든 입력 라인을 반복합니다. 또는 내가 좋아하는 것- "echo"를 문제의 명령 앞에 추가하십시오.
for 루프를 대신 사용하면 작동하지만 데이터 세트 목록의 잠재적 크기로 인해 최대 확장 명령 줄 길이에 문제가 발생할 수 있습니다.
ssh 명령이있는 루프 만 나에게 문제가 있음을 99.999 % 확신합니다!
ssh 명령이 실행되는 반복이 완료되었습니다. while 루프에 입력 된 데이터가 갑자기 손실되는 것처럼 보입니다. 처음 몇 개의 입력 행이 ssh 명령을 수행하지 않으면 실제로 SSH 명령을 실행할 때까지 루프가 계속됩니다.
필자가 테스트하고있는 랩탑에는 2 개 또는 3 개의 샘플 데이터 세트 만있는 2 개의 Solaris 10 VM이 있지만이 기능이 적용되는 대규모 SPARC 시스템에서도 마찬가지입니다. 많은 데이터 세트가 있습니다.
actionlist
. ssh의 표준 입력을/dev/null