我已经构建了一个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.d
,update-rc.d
和deamon
的经验,所以我不确定出了什么问题,这是不是一个好方法。
谢谢, Yenthe
答案 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,它根据监视文件/目录中的更改而不是时间事件来执行脚本。