在 Linux 上监视命令以通知新创建的文件
如何修改以下命令以通知 Linux 用户 john 创建新文件到 /usr/local/mydir/?
watch -d 'ls -l /usr/local/mydir/ | fgrep john'
即,我想要持续监视并在 /usr/local/mydir/ 中创建任何新文件时调用另一个脚本。
因为在生产中我无法使用任何工具来代替 shell 脚本。那么能帮我提供 shell 脚本解决方案吗?
答案1
与其不断地以这种方式拉取目录,不如尝试使用inotify
为此目的而设计的子系统。对于用户空间工具,请查看inotify-tools
。
答案2
inotify
SvenW 建议的是一个很好的选择。
只是有所不同:对于这类东西,另一种更完整的方法是使用内核审计子系统和auditd
。auditd
如果尚未安装,只需安装,然后auditctl
在您的案例中使用
auditctl -w /usr/local/mydir/ -p wa -F uid=john -k johnschangedfiles
会做。
然后,您可以运行报告并查看发生的情况和时间的非常详细的日志:
ausearch -f /usr/local/mydir/
这会产生与此类似的结果:
time->Fri Feb 3 12:45:19 2012
type=PATH msg=audit(1328265919.961:11): item=0 name="/tmp/test/foo" inode=1839907 dev=fd:00 mode=0100664 ouid=500 ogid=500 rdev=00:00 obj=unconfined_u:object_r:user_tmp_t:s0
type=CWD msg=audit(1328265919.961:11): cwd="/tmp"
type=SYSCALL msg=audit(1328265919.961:11): arch=c000003e syscall=2 success=yes exit=3 a0=7fffa6f4262e a1=941 a2=1b6 a3=3136fb0d0c items=1 ppid=12414 pid=23531 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=686 comm="touch" exe="/bin/touch" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="jpikkschangedfiles"
答案3
如果您坚持只使用标准工具,那么如下脚本可能会有所帮助:
#!/bin/bash
ls -l /usr/local/mydir | grep john > /tmp/watchfile
while true; do
sleep 10
ls -l /usr/local/mydir | grep john > /tmp/watchfile2
diff -q /tmp/watchfile /tmp/watchfile2 > /dev/null
if [ $? -ne 0 ] ; then
echo "File list changed"
exit ;
fi
cp /tmp/watchfile2 /tmp/watchfile
done
如果您想连续运行此脚本,请将该行替换echo
为您想要的操作,然后删除该行。exit
注意:这将对目录列表的任何修改起作用,即使文件只是更新而不是添加。