我想知道我是否可以获得有关我正在从事的项目的帮助。我有一台 Synology NAS。我发现了一个社区包,每当 USB 驱动器插入其中一个驱动器时,它就会自动运行我创建的脚本。我的脚本将图像和电影文件从脚本中列出的所有 USB 驱动器/Sandisk 卡复制到 Synology 上的特定文件夹中。 autorun包运行脚本每一个问题是,如果我在 15 秒内依次插入四个 USB 驱动器,则会将所有四个驱动器复制四次。相反,我希望它等待 15 秒,让我插入所有 USB,然后复制所有驱动器一次。
我的脚本是:
#!/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}
我的目标是让脚本等待给定时间(例如 15 秒),以便我插入所有四个 USB。然后 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
它们都是很好的副本,所以哪一个获胜并不重要。不会出现文件截断或损坏的情况,只是对磁盘的写入次数多于绝对必要的次数。
当然,如果您愿意,您可以排除其他竞争实例。 C新闻施洛克 实用程序是一种方便的方法。第一个运行的脚本将写入一个锁定文件,上面写着“请勿进入!”,后续脚本将注意到它并立即退出,然后再尝试执行任何工作。
问ps
“我已经在跑步了吗?”会给你一个暗示
关于现有的后台进程。但是使用适当的锁定原语将会保证任何时刻最多有一个参与者位于临界区内。这种ps
方法总是有点活泼。
答案2
我不认为你的做法是正确的。 “事件”是指安装所有 4 个驱动器时,而不是 15 秒后。
如果未安装所有 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
上述注意事项:除非安装了所有四个脚本,否则脚本将退出。