使用expect和inotifywait来监视linux上文件夹的变化

时间:2016-02-12 15:55:28

标签: linux expect udev inotifywait

我原本想要一个脚本,当我在我的电脑上插入一个USB记忆棒然后另一个脚本被删除时,我用udev搞砸了没有任何成功,所以这显然不是最好的选择,我然后遇到inotifywait,我可以看到我的驱动器安装时的文件夹,因为这会给我我正在寻找的CREATE,ISDIR myfolder输出,但是使用它实际触发外部脚本有点超出我的编程技巧,我已经看过了EXPECT,但是看不出我是如何完成任务的,我想基本上我需要创建一个遵循下面所示流程的expect脚本

Expect spawns the inotifywait process
expect then starts a loop
if the loop sees "CREATE,ISDIR test" then run script active.sh
if the loop sees "DELETE,ISDIR test" then run scrip inactive.sh
Loop

可能有一种更简单的方法可以做到这一点但是我已经到处搜索并尝试了各种不同的组合,简而言之我希望脚本在创建某个文件夹时运行,然后在删除时运行另一个文件夹,有一个简单的方法吗?

1 个答案:

答案 0 :(得分:0)

您只需要生成进程并等待所需的单词。这就是全部。

#!/usr/bin/expect
# Monitoring '/tmp/' directory
set watchRootDir "/tmp/"
# And, monitoring of folder named 'demo'
set watchFolder "demo"

puts "Monitoring root directory : '$watchRootDir'"
puts "Monitoring for folder : '$watchFolder'"

spawn  inotifywait -m -r -e create,delete /tmp
expect {
        timeout {puts "I'm waiting ...";exp_continue}
        "/tmp/ CREATE,ISDIR $watchFolder" {
            puts "Folder created"
            #  run active.sh here ...
            exp_continue
         }
        "/tmp/ DELETE,ISDIR $watchFolder" {
            puts "Folder deleted"
            #  run inactive.sh here ...
         }
}
# Sending 'Ctrl+C' to the program, so that it can quit 
# gracefully. 
send "\003"
expect eof

输出

dinesh@myPc:~/stackoverflow$ ./Jason 
Monitoring root directory : '/tmp/'
Monitoring for folder : 'demo'
spawn inotifywait -m -r -e create,delete /tmp
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
I'm waiting ...
I'm waiting ...
/tmp/ CREATE,ISDIR demo
Folder created
I'm waiting ...
/tmp/ DELETE,ISDIR demo
Folder deleted

在产生inotifywait时,我添加了更多选项。 -m标志用于连续监视,默认情况下inotifywait将在第一个事件中退出,-r表示递归或通过子目录检查。

我们需要指定-e标志以及我们想要通知的事件列表。因此,在这里,我们要监控文件夹的createdelete事件。

参考:inotifywait