最终,我想检测一个新的备份文件被放入目录中,然后将该新文件移动到另一个位置以进行其他操作。
当没有人登录服务器并且我用来启动操作的脚本将由 crontab 条目触发时,这需要起作用。
我尝试像这样使用“inotifywait”:
dir=/home/userid/drop/
target=/home/userid/current/
inotifywait -m "$dir" --format '%w%f' -e create |
while read file; do
mv "$file" "$target"
done
这只适用于您打开了终端窗口会话。如果您尝试使用 crontab 条目在无人值守的情况下启动此 scipt,则 inotifywait 命令将被忽略。
于是我尝试使用“entr”并发现了同样的问题。仅当您打开终端窗口时它才有效。当我使用 entr 创建脚本并使用 crontab 条目在无人值守的情况下触发它时,它被忽略,就像 inotifywait 示例一样。
所以我知道这可以使用“stat”来完成,并且我已经查看了很多示例并尝试为我的目的找出它们,但我只是不理解它的语法。
我知道 stat 可以检测目录中是否存在新文件,但我不知道如何处理该结果以触发 mv (移动)命令的执行以将新文件移动到不同的位置。
一旦我有了可以做到这一点的统计语法,我将需要它永久运行。也许它只每 15 秒检查一次或什么的,但我需要它始终准备好移动文件。
如果有人有这样做的经验,并且可以帮助我使用链接 stat 来执行另一个命令的语法,我将不胜感激。我真的相信其他人也想知道如何做到这一点,因为我无法想象每个人都可以为其他 2 个解决方案保持 ssh putty 窗口 24/7 打开。
提前致谢。
巴克曼
答案1
所有你需要的是incron
。incron
如果您有 Ubuntu/Debian,请先安装软件包:
sudo apt install incron
或使用 Red Hat/Fedora 命令:
sudo yum install incron
在您最喜欢的文本编辑器中打开文件/etc/incron.allow
- 让它成为vim
:
vim /etc/incron.allow
并添加带有您的用户名的新行(假设是bob
)以允许他使用incron
:
bob
然后打开incron
规则编辑器:
incrontab -e
并添加以下行:
/home/userid/drop/ IN_CREATE mv /home/userid/drop/$# /home/userid/current/
其中$#
是incron
内置通配符,表示 检测到的新删除的备份文件的名称incron
。
要测试创建的规则,请将文件添加到/home/userid/drop/
目录并检查删除的文件是否已移动到/home/userid/current/
目录。另外检查系统日志:
tail /var/log/syslog
答案2
定期cron
作业是不合适的,因为它们只是偶尔运行,而对 inode 更改做出反应的进程必须始终运行。@reboot
启动一个(希望)永远运行的进程的作业就足够了。
$ crontab -l
@reboot /home/jhqdoe/job
$ cat job
#!/bin/sh
dir=/home/jhqdoe/drop/
target=/home/jhqdoe/current/
inotifywait -m "$dir" --format '%w%f' -e create \
| while read file; do mv -- "$file" "$target"; done
$ sudo reboot
如果可能的话,由 init 系统管理的启动守护进程可能是更好的选择,因为如果作业由于多种原因失败,这些守护进程更容易重新启动。