12

我正在寻找编写一个小的 bash 脚本,以便在启动时监视任何新创建的文件的目录。如果出现新文件,我希望它的存在触发第二个脚本运行。

我看到这被用来触发压缩最近数字化的视频,并将其添加到摄取镜头的日志中。

目前我的代码如下所示:

#!/bin/sh

##VIDSTAT is a global variable coming from a parent script.
##proj is the ingestion directory coming from a parent script
proj=$1

dir="/home/$USER/data/movies/$proj"
dirlist=$(ls $dir)


while { $VIDSTAT -eq 1 }:
do
    for mov in $dirlist
    do
        if [ "$(( $(date +"%s") - $(stat -c "%Y" $mov) ))" -lt "5" ]
        then
        ~/bin/compressNlog.sh $mov
        fi
    done
done

有没有更简单/更清洁/更少内存密集型的方法来做到这一点?

编辑我将更改每个捕获会话的摄取目录。我已经相应地调整了代码

4

3 回答 3

18

incron怎么样?它触发文件/目录更改命令。

sudo apt-get install incron

例子:

<path> <mask> <command>

where<path>可以是一个目录(意味着该目录和/或直接在该目录中的文件(不是该目录的子目录中的文件!)被监视)或文件。

<mask>可以是以下之一:

IN_ACCESS           File was accessed (read) (*)
IN_ATTRIB           Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
IN_CLOSE_WRITE      File opened for writing was closed (*)
IN_CLOSE_NOWRITE    File not opened for writing was closed (*)
IN_CREATE           File/directory created in watched directory (*)
IN_DELETE           File/directory deleted from watched directory (*)
IN_DELETE_SELF           Watched file/directory was itself deleted
IN_MODIFY           File was modified (*)
IN_MOVE_SELF        Watched file/directory was itself moved
IN_MOVED_FROM       File moved out of watched directory (*)
IN_MOVED_TO         File moved into watched directory (*)
IN_OPEN             File was opened (*)

<command>是事件发生时应该运行的命令。在命令规范中可以使用以下通配符:

$$   dollar sign
$@   watched filesystem path (see above)
$#   event-related file name
$%   event flags (textually)
$&   event flags (numerically)

如果你观察一个目录,那么 $@ 保存目录路径和 $# 触发事件的文件。如果您查看文件,则 $@ 保存文件的完整路径,而 $# 为空。

工作示例:

$sudo echo spatel > /etc/incron.allow
$sudo echo root > /etc/incron.allow

启动守护进程:

$sudo /etc/init.d/incrond start

编辑incrontab文件

$incrontab -e
/home/spatel IN_CLOSE_WRITE touch /tmp/incrontest-$#

测试一下

$touch /home/spatel/alpha

结果:

$ls -l /tmp/*alpha*
-rw-r--r-- 1 spatel spatel 0 Feb  4 12:32 /tmp/incrontest-alpha

注意:Ubuntu您需要在启动时激活 inotify 。请在 Grub menu.lst 文件中添加以下行:

kernel /boot/vmlinuz-2.6.26-1-686 root=/dev/sda1 ro inotify=yes
于 2013-02-04T17:56:04.770 回答
6

您可以使用神奇的inotify工具来做到这一点:

inotifywait -r -m ./YOUR_MONITORED_DIR |
    while read a b file; do
        [[ $b == *CREATE* ]] && ./another_script "$file"
    done

这种方法有一个很大的优势是可以避免每 N 秒轮询一次。

Inotify(inode notify)是一个 Linux 内核子系统,用于扩展文件系统以通知文件系统的更改,并将这些更改报告给应用程序。它取代了具有类似目标的早期设施 dnotify。

http://en.wikipedia.org/wiki/Inotify
查看inotify 文档

于 2013-02-04T17:48:32.970 回答
1

使用iwatch。不完全是。它将处理制作守护进程、在启动时运行、监控和记录等所有细节。您需要做的就是设置选项,并让您的 bash 脚本处理对文件进行实际操作的细节。

于 2013-02-04T17:52:32.350 回答