원격 호스트에서 로컬 호스트로 가져오기 위해 rsync를 실행 중입니다.
rsync -a --update user@remotehost:/files/ ~/files/
Java에서 명령을 실행하고 종료 코드를 사용하여 명령이 성공했는지 확인합니다.
로컬 파일이 수정된 경우 명령 보고를 다시 받을 수 있습니까? 종료 코드로 보고하는 것이 이상적입니다.
답변1
rsync
종료 코드에서는 이를 알 수 없습니다 . 종료 코드에는 사전 정의된 의미가 문서화되어 있습니다.
내 생각에 Java에서 이 작업을 수행하는 가장 좋은 방법은 --info=NAME
업데이트된 디렉터리와 파일 이름만 언급하는 옵션을 추가하는 것입니다.
rsync -a --info=NAME --update user@remotehost/files/ ~/files/
그러면 업데이트된 파일과 디렉터리의 이름이 한 줄에 하나씩 표준 출력(fd = 0)에 인쇄됩니다.
그런 다음 출력을 수집 rsync
하고 문자열의 개행 수를 계산합니다.
출력을 수집하는 좋은 방법은 이 답변 에서 찾을 수 있다고 생각 java
하지만 아직 시도하지 않았습니다.https://stackoverflow.com/a/9048519/5484716
하다아니요표준 출력과 표준 오류 스트림을 사용 redirectErrorStream
하거나 다른 방법으로 결합합니다. 이렇게 하면 오류 메시지가 업데이트된 파일로 간주되며 이는 원하는 결과가 아닙니다.
답변2
rsync 인쇄 복사 파일 이름을 갖는 @DavidKing의 아이디어를 기반으로 하고 stdin이 비어 있을 때 grep이 0이 아닌 종료 상태로 종료된다는 @yashma의 정보를 확장하면 만족스러울 정도로 짧고 신비한 한 줄의 내용을 생각해 낼 수 있습니다.
# prints file list, exits nonzero when that list is empty
rsync -a --info=NAME --update user@remotehost:/files/ ~/files/ | grep .
답변3
플래그를 --info
켜면 rsync
전송된 모든 파일의 경로가 출력됩니다. 종료 코드는 rsync
성공/실패를 나타내므로 명령 주위에 스크립트를 래핑하지 않으면 사용할 수 없습니다.
#!/bin/bash
files=$(rsync -a --info=NAME --update user@remotehost/files/ ~/files/)
if [ $files = "" ]; then
# files weren't transferred
exit 0
else
# files were transferred
exit 1
fi
rsync
그런 다음 명령을 직접 호출 하는 대신 Java에서 스크립트를 호출하십시오 . rsync
전송 시작과 끝 부분에 추가 텍스트 줄이 있을 수 있으므로 if
추가 출력 줄을 고려하여 명령문을 조정해야 할 수도 있지만 기본 아이디어는 작동합니다.
답변4
반환 코드를 통해 정보를 얻는 방법은 쉘 스크립트를 작성하고, rsync
java에서 쉘 스크립트를 호출하여 실행하는 것입니다. 아래에 요약한 것처럼 여기에는 몇 가지 중요한 문제가 있습니다. 쉘 스크립트는 다음과 같습니다:
#!/bin/sh
if OUTPUT=$(rsync -a --info=NAME --update user@remotehost/files/ ~/files/)
then
if [ "$OUTPUT" != "" ] # got output?
then
exit 0 # yes, success, "some" files were updated
fi
fi
exit 1 # either rsync failed or no files were updated
이것의 가장 큰 문제는 동기화 프로세스 자체가 성공적으로 완료되었는지 여부를 알 수 없다는 것입니다. 파일이 업데이트되었는지 여부만 알 수 있습니다. 그래서 출력을 수집하고 Java에서 행 수를 계산하는 것이 좋습니다.그리고반환 코드 확인자바에서.