如何运行基于脚本的工具来处理连续下载到给定目录的文件?我想最小化延迟(〜1秒就可以了),脚本可以有自己的无限循环。
我知道一些方法,比如:
- 使用
.bashrc
或.profile
调用我的脚本自动登录用户 - 从 cron 分叉脚本,然后忽略它是否已经在运行
- 以某种方式使用初始化脚本(我猜它在发行版之间有所不同)
什么方法最有效?
答案1
以某种方式使用初始化脚本(我猜它在发行版之间有所不同)
确实如此。这里是systemd方式,完全不涉及System 5rc
脚本。这是两个单位。因为它们是非封装非系统单元,所以它们被放入/etc/systemd/system
。第一个是服务单位它描述了将程序作为守护进程运行:
# /etc/systemd/system/example-spooler.service [单元] 描述=/var/spool/example/ 中的进程文件 文档=http://unix.stackexchange.com/questions/203637/ [服务] ExecStart=/usr/local/bin/example-spooler /var/spool/example/
请注意,您不必显式启动或停止此服务。这是路径激活。这路径单元描述了 systemd 监控的路径以及它寻找的是第二个单元文件:
# /etc/systemd/system/example-spooler.path [单元] 描述=监视 /var/spool/example/ 并激活 example-spooler.service 文档=http://unix.stackexchange.com/questions/203637/ [小路] DirectoryNotEmpty=/var/spool/example/ [安装] WantedBy=多用户.target
要在引导时自动启动它,请运行systemctl preset example-spooler.path
.要立即启动,请运行systemctl start example-spooler.path
.
进一步阅读
- 伦纳特·珀特林 (2013-10-07)。
systemd.path
。 systemd 手册页。 freedesktop.org。
答案2
假设你的脚本是在Linux下运行,你可以使用inotify等待来自初始化脚本。您可能需要对整个下载树进行递归搜索(选项-r
)。请记住,要监视的每个节点最多可以占用 1kB 的内核内存。
主要优点inotify是为了防止代价高昂的轮询循环。一旦受监视的目录树中发生文件操作,它就会触发事件,否则会消耗不明显的 CPU 资源。