CentOS7에 3개의 노드가 있고 RHEL7에 1개의 노드가 있는 가상 머신 클러스터가 있습니다. crontab에는 rsync가 활성화된 디렉터리가 있으며 /mnt/<server_IP>/portal/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default/api/
설정은 다음과 같습니다.
$ incrontab -l
/mnt/<server_IP>/portal/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default/api/ IN_MODIFY,IN_ATTRIB,IN_CREATE,IN_DELETE /mnt/rsync/rsync-for-carbon-depsync.sh
디버깅이 활성화된 rsync 스크립트
#!/bin/sh -ex
#source folder
portal=/mnt/<server_IP>/portal/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default/
#Destination folder
gateway=/mnt/<server_IP>/gateway/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default
LOG=/log/rsync/carbon-rsync-logs/"log-local-$(date +%Y%m%d_%H%M%S).log"
echo "entered the script" >> $LOG
#keep a lock to stop parallel runs
(
echo "entered the flock" >> $LOG
flock -e 10
echo "Obtained the lock" >> $LOG
echo " ========== $(date -Iseconds) Lock acquired by local thread <server_IP>< =========== " >> $LOG
rsync --delete -arv $portal $gateway >> $LOG
) 10> /var/rsync/.rsync.lock
echo " ========== $(date -Iseconds) Release Lock acquired by local thread <server_IP> =========== " >> $LOG
아래는 로그 파일입니다
entered the script
entered the script
기본적으로 모든 변경 사항은 portal
에 반영되어야 합니다 gateway
. portal
디렉터리에 임시 파일을 만들었습니다. 하지만 gateway
디렉토리 에는 반영되지 않습니다 . 이는 새로운 RHEL 7 VM에서만 작동합니다. 이전 CentOS 7 VM은 동일한 스크립트로 잘 작동합니다.
답변1
/tmp/errors
두 번째 줄에 새 명령을 추가하여 로그 파일에 오류 보고를 활성화하는 것이 좋습니다. 조금 확장하여 예상되는 출력과 예상치 못한 오류를 단일 파일에 캡처하기 위해 다음과 같이 수정했습니다 /tmp/output
.
#!/bin/sh -ex
exec >/tmp/output 2>&1
#source folder
portal=/mnt/<server_IP>/portal/wso2telcohub-3.0.2/repository/deployment/server/synapse-configs/default/
...
프로덕션 환경에서 사람들은 더 잘 정의된 로그 파일에 기록하거나 시스템 로거를 사용하기도 합니다( man logger
자세히 알아보기).
쉘 -e
플래그는 성공하지 못한 상태(0이 아닌 종료 코드)를 반환하는 명령을 실행한 후 즉시 종료되도록 합니다. 오류 로그는 셸이 종료될 때 오류로 인해 생성된 출력을 캡처합니다. 이 -x
플래그는 추적을 활성화합니다. 로그 파일도 추적할 수 있습니다.
안에논평네가 결정해,"/var
RHEL 7에는 rsync 디렉터리가 없습니다.".
따라서 스크립트가 RHEL 7에서 실행되지 않는 이유는 스크립트에 필요한 디렉터리를 생성하지 않았기 때문입니다. 스크립트가 쓰기를 시도 /var/rsync/.rsync.lock
하지만 상위 디렉터리가 존재하지 않기 때문에 쓸 수 없습니다.
해결책은 디렉토리를 생성하고 스크립트를 실행하는 UID가 디렉토리에 쓸 수 있는지 확인하는 것입니다. 더 나은 방법은 디렉토리가 아직 존재하지 않는 경우 스크립트를 수정하여 디렉토리를 생성하거나, 포착하여 실제 사람에게 제공할 수 있는 방식으로 이 오류를 보고하는 것입니다.