私が進めているプロジェクトに役立つかどうか疑問に思います。私はシノロジーNASを持っています。 USBドライブがドライブの1つに接続されるたびに、私が作成したスクリプトを自動的に実行するコミュニティパッケージが見つかりました。私のスクリプトは、スクリプトにリストされているすべての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
。
その後、即時および遅延後にすべてを2回実行できます。
sync_all
sleep 15
sync_all
素晴らしい点は、rsync
ファイルがコピーされたかどうかを知ることができるので、何度も実行すると「ほとんど無料」ということです。
あなたはしません必要rsync間の調整。一対のrsyncプロセスが巨大なReadMeファイルを/hereから/thereに同時にコピーしようとするとします。 /there/ReadMeはすべて開きますか?いいえ!代わりに、彼らは/there/.123や/there/.456のような新しいランダムファイル名を考案し、次の場所にコピーしました。それそして最後に、/there/ReadMeの数値ファイル名に対してrename()
アトミック操作を実行します。mv
どちらも良いコピーなのでどちらが勝っても構いません。ファイルが切り捨てられたり破損したりすることはなく、必要なものよりも多くの書き込みがディスクに行われます。
もちろん、必要に応じて他の競合インスタンスを除外することもできます。シーニュースシュロック ユーティリティは便利な方法です。実行される最初のスクリプトは「入力しないでください!」というロックファイルに書き込まれ、その後のスクリプトはそれを認識して再操作を試みる前にすぐに終了します。
ps
「もう走ってますか?」と聞くならヒント
既存のバックグラウンドプロセスに関して。しかし、適切なロックプリミティブを使用すると、保証するいつでも最大1人の参加者が重要なセクションにいる可能性があります。この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
上記の注意事項:4つのスクリプトがすべてインストールされていない場合、スクリプトは終了します。