gpt4 book ai didi

linux - 如何连续运行 inotifywait 并将其作为 cron 或 demon 运行?

转载 作者:太空狗 更新时间:2023-10-29 11:36:16 25 4
gpt4 key购买 nike

我构建了一个 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 将不再运行,重启后不会重启。我决定创建一个在引导时启动的初始化脚本(我认为)。我通过将文件 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

但是,当我重新启动并将 PDF 放入文件夹 ~/Desktop/PdfFolder 时,什么也不会发生,而且脚本似乎没有关闭。我对 init.dupdate-rc.ddeamon 真的没有经验,所以我不确定哪里出了问题,如果这是否是一个好方法。

谢谢,延特

最佳答案

  • 作为初始化脚本,您应该添加 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 )。如果您的主目录不在根分区上,这是必不可少的。

  • 另一个问题是在您的初始化脚本中您使用的是 ~ :

    inotifywait -m ~/Desktop/PdfFolder ...

    ~扩展到当前用户主目录。初始化脚本以 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 .这些技巧可以让您在未来省去很多麻烦!

关于linux - 如何连续运行 inotifywait 并将其作为 cron 或 demon 运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35240994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com