如何连续运行inotifywait并将其作为cron或deamon运行?

时间:2016-02-06 12:29:15

标签: linux shell init inotify

我已经构建了一个shell脚本,该脚本使用inotifywait自动检测特定目录上的文件更改。当在目录中删除一个新的PDF文件时,该脚本应该关闭,然后应该触发ocropus-parser在其上执行一些命令。代码:

#!/bin/sh
inotifywait -m ~/Desktop/PdfFolder -e create -e moved_to |
while read path action file; do
    #echo "The file '$file' appeared in directory '$path' via '$action'"
    # Check if the file is a PDF or another file type.
    if [ $(head -c 4 "$file") = "%PDF" ]; then
        echo "PDF found - filename: " + $file
        python ocropus-parser.py $file
    else
        echo "NOT A PDF!"
fi
done

当我使用./filenotifier.sh通过终端运行此脚本时,这非常有效,但是当我重新启动Linux(Ubuntu 14.04)时,我的shell将不再运行,并且在重新启动后不会重新启动。 我决定创建一个在启动时启动的init脚本(我认为)。我这样做是将文件filenotifier.sh复制到init.d

sudo cp ~/Desktop/PdfFolder/filenotifier.sh /etc/init.d/

然后我给了文件正确的权利:

sudo chmod 775 /etc/init.d/filenotifier.sh

最后我将文件添加到update-rc.d

sudo update-rc.d filenotifier.sh defaults

然而,当我重新启动并删除文件夹~/Desktop/PdfFolder中的PDF时,什么都不会发生,而且似乎脚本没有关闭。 我真的没有init.dupdate-rc.ddeamon的经验,所以我不确定出了什么问题,这是不是一个好方法。

谢谢, Yenthe

2 个答案:

答案 0 :(得分:3)

  • 作为init-script,您应该将LSB header添加到您的脚本中,如下所示:

    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides:          filenotifier
    # Required-Start:    $remote_fs $syslog
    # Required-Stop:     $remote_fs $syslog
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6
    # Short-Description: Something
    # Description:       Something else
    ### END INIT INFO
    
    inotifywait -m ...
    

    这样,您可以确保在所有挂载点都可用时运行脚本(感谢Required-Start: $remote_fs)。如果您的主目录不在根分区上,这是必不可少的。

  • 另一个问题是,在您的init脚本中,您正在使用~

    inotifywait -m ~/Desktop/PdfFolder ...
    

    ~扩展到当前用户主目录。 Init-scripts以root身份运行,因此它将扩展为/root/Desktop/PdfFolder。请改用~<username>

    inotifywait -m ~yenthe/Desktop/PdfFolder ...
    

    (假设您的用户名为yenthe。)

    或者也许在开始之前切换用户(使用sudo)。

  • $file是没有目录路径的基本名称。在命令中使用"$path/$file"

    "$(head -c 4 "$path/$file")"
    python ocropus-parser.py "$path/$file"
    

    也许可以考虑使用name代替file,以避免混淆。

  • 如果事情不起作用,或者一般情况下你想调查某事,请记得使用ps,如下所示:

    ps -ef | grep inotifywait
    
    例如,

    ps会告诉您脚本是否正在运行以及是否使用正确的参数启动了inotifywait

  • 最后但并非最不重要:使用"$file",而不是$file;使用"$(head -c 4 "$file")",而不是$(head -c 4 "$file");使用read -r,而不是read。这些提示可以为您节省很多麻烦!

答案 1 :(得分:2)

为此目的, postList = new ArrayList<Post>(); retrievePosts(); fab= (com.melnykov.fab.FloatingActionButton) findViewById(R.id.fab); mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); mRecyclerView.setHasFixedSize(true); mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); mAdapter = new MyRecyclerViewAdapter(postList); mRecyclerView.setAdapter(mAdapter); 的开发人员创建了incron。它是一个类似守护进程的cron,它根据监视文件/目录中的更改而不是时间事件来执行脚本。