제가 진행하고 있는 프로젝트에 도움을 받을 수 있는지 궁금합니다. 저는 시놀로지 NAS를 가지고 있습니다. USB 드라이브가 드라이브 중 하나에 연결될 때마다 내가 만든 스크립트를 자동으로 실행하는 커뮤니티 패키지를 찾았습니다. 내 스크립트는 스크립트에 나열된 모든 USB 드라이브/Sandisk 카드의 이미지 및 동영상 파일을 Synology의 특정 폴더에 복사합니다. 자동 실행 패키지 실행 스크립트모든문제는 4개의 USB 드라이브를 서로 15초 이내에 연결하면 4개의 드라이브가 모두 4번 복사된다는 것입니다. 대신, 모든 USB를 연결하고 모든 드라이브를 한 번 복사할 때까지 15초 동안 기다리기를 원합니다.
내 스크립트는 다음과 같습니다
#!/bin/bash
#
var=$(date +"%FORMAT_STRING")
now=$(date +”%m_%d_%Y_%s”)
printf "%s\n" $now
today=$(date +%m-%d-%Y-%s)
rsync -avz --prune-empty-dirs --include "*/" --include="*."{cr2,CR2,mov,MOV,mpg,MPG,dng,DNG,jpg,JPG,jpeg,JPEG} --exclude="*" /volumeUSB1/usbshare/ /volume1/KingstonSSD/Camera_Loads/Sandisk-${today}
rsync -avz --prune-empty-dirs --include "*/" --include="*."{cr2,CR2,mov,MOV,mpg,MPG,dng,DNG,jpg,JPG,jpeg,JPEG} --exclude="*" /volumeUSB2/usbshare/ /volume1/KingstonSSD/Camera_Loads/Sandisk-${today}
rsync -avz --prune-empty-dirs --include "*/" --include="*."{cr2,CR2,mov,MOV,mpg,MPG,dng,DNG,jpg,JPG,jpeg,JPEG} --exclude="*" /volumeUSB3/usbshare/ /volume1/KingstonSSD/Camera_Loads/Sandisk-${today}
rsync -avz --prune-empty-dirs --include "*/" --include="*."{cr2,CR2,mov,MOV,mpg,MPG,dng,DNG,jpg,JPG,jpeg,JPEG} --exclude="*" /volumeUSB4/usbshare4-2/ /volume1/KingstonSSD/Camera_Loads/Sandisk-${today}
내 목표는 4개의 USB를 모두 연결할 때까지 스크립트가 주어진 시간(예: 15초) 동안 기다리도록 하는 것입니다. 그런 다음 15초 후에 코드를 한 번 실행합니다. 연결된 USB가 이미 코드를 실행하고 있는지 확인해야 할 것 같습니다. 그렇다면 현재 스크립트를 종료하고, 그렇지 않으면 파일을 복사하십시오.
나는 이것을 발견했고 그것을 조정하고 스크립트에 추가하여 내 스크립트의 다른 인스턴스가 실행 중인지 확인하고 그렇다면 종료하거나 그렇지 않으면 파일을 복사할 수 있는지 궁금합니다.
if [ `ps -ef | grep "script.sh" | grep -v grep | wc -l` -gt 1 ] ; then
echo "RUNNING...."
else
echo "NOT RUNNING..."
fi
누구든지 이 문제를 해결하도록 도와주실 수 있나요?
미리 감사드립니다!
답변1
당신이 쓴
today=$(date +%m-%d-%Y-%s)
...
답은 간단할 것 같네요
today=$(date +%m-%d-%Y-%s)
sleep 15
...
이것을 rsync
이라는 bash 함수 에 넣는 것을 고려해보세요 sync_all
.
그런 다음 즉시 및 지연 후에 모든 것을 두 번 실행할 수 있습니다.
sync_all
sleep 15
sync_all
멋진 점 rsync
은 파일이 복사되었는지 여부를 알 수 있기 때문에 여러 번 실행하면 "대부분 무료"라는 것입니다.
당신은하지 않습니다필요rsync 간의 조정. 한 쌍의 rsync 프로세스가 거대한 ReadMe 파일을 /here에서 /there로 동시에 복사하려고 시도한다고 가정합니다. /there/ReadMe가 모두 열리나요? 아니요! 대신에 그들은 /there/.123 또는 /there/.456과 같은 새로운 임의의 파일 이름을 고안하여 다음 위치에 복사했습니다.저것, 그리고 마지막으로 /there/ReadMe의 숫자 파일 이름에 대해 rename()
원자적 작업을 수행합니다 . mv
둘 다 좋은 사본이므로 어느 쪽이 이기든 상관없습니다. 파일이 잘리거나 손상되지 않으며 꼭 필요한 것보다 더 많은 쓰기가 디스크에 이루어집니다.
물론 원한다면 다른 경쟁 인스턴스를 제외할 수도 있습니다. 씨뉴스슈록 유틸리티는 편리한 방법입니다. 실행되는 첫 번째 스크립트는 "입력하지 마십시오!"라는 잠금 파일에 기록되며 후속 스크립트는 이를 인지하고 다시 작업을 시도하기 전에 즉시 종료됩니다.
ps
"이미 달리고 있나요?"라고 묻는 다면힌트
기존 백그라운드 프로세스와 관련하여. 그러나 적절한 잠금 프리미티브를 사용하면보장하다언제든지 최대 한 명의 참가자가 중요 섹션에 있을 수 있습니다. 이 ps
접근 방식은 항상 약간 빠릅니다.
답변2
나는 당신이 하고 있는 일이 옳다고 생각하지 않습니다. "이벤트"는 15초 후가 아니라 4개의 드라이브가 모두 마운트되는 경우입니다.
4개 드라이브가 모두 마운트되지 않은 경우 종료되도록 스크립트를 수정할 수 있습니다.
#!/bin/bash
#
# test if a drive is mounted ..
mountp() { findmnt ${MNTPT} >/dev/null }
if mountp volumeUSB1 && mountp volumeUSB2 && mountp volumeUSB3 && mountp volumeUSB4 ; then
var=$(date +"%FORMAT_STRING")
now=$(date +”%m_%d_%Y_%s”)
printf "%s\n" $now
today=$(date +%m-%d-%Y-%s)
rsync -avz --prune-empty-dirs --include "*/" --include="*."{cr2,CR2,mov,MOV,mpg,MPG,dng,DNG,jpg,JPG,jpeg,JPEG} --exclude="*" /volumeUSB1/usbshare/ /volume1/KingstonSSD/Camera_Loads/Sandisk-${today}
rsync -avz --prune-empty-dirs --include "*/" --include="*."{cr2,CR2,mov,MOV,mpg,MPG,dng,DNG,jpg,JPG,jpeg,JPEG} --exclude="*" /volumeUSB2/usbshare/ /volume1/KingstonSSD/Camera_Loads/Sandisk-${today}
rsync -avz --prune-empty-dirs --include "*/" --include="*."{cr2,CR2,mov,MOV,mpg,MPG,dng,DNG,jpg,JPG,jpeg,JPEG} --exclude="*" /volumeUSB3/usbshare/ /volume1/KingstonSSD/Camera_Loads/Sandisk-${today}
rsync -avz --prune-empty-dirs --include "*/" --include="*."{cr2,CR2,mov,MOV,mpg,MPG,dng,DNG,jpg,JPG,jpeg,JPEG} --exclude="*" /volumeUSB4/usbshare4-2/ /volume1/KingstonSSD/Camera_Loads/Sandisk-${today}
fi
위 사항에 대한 참고 사항: 네 개의 스크립트가 모두 설치되지 않으면 스크립트가 종료됩니다.