- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我构建了一个 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.d
、update-rc.d
和 deamon
真的没有经验,所以我不确定哪里出了问题,如果这是否是一个好方法。
谢谢,延特
最佳答案
作为初始化脚本,您应该添加 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/
Demon是程序需要使用的解决方案。 我觉得api也一样。 我无法定义 demon 和 api 之间的区别? 你如何划分它? 最佳答案 Demon 是一个为客户端进程提供一些有用服务的进程。 API
我想创建一个具有 3d 效果的旋转对象,我使用的是 developer.apple.com 提供的示例项目 iPhoneGLEssentials。在示例项目中使用了 demon.model 文件,我需
我构建了一个 shell 脚本,它使用 inotifywait 自动检测特定目录中的文件更改。当一个新的 PDF 文件被放到目录中时,这个脚本应该关闭,然后它应该触发 ocropus-parser 对
我是一名优秀的程序员,十分优秀!