如何启动文件处理守护进程?

tom*_*ash 5 startup monitoring shell-script files daemon

如何运行基于脚本的工具,该工具将在文件到达时处理连续下载到给定目录的文件?我想尽量减少延迟(~1 秒就可以了),脚本可以有自己的无限循环。

我知道几种方法,例如:

  • 使用.bashrc.profile调用我的脚本的自动登录用户
  • 从 cron fork 脚本,然后忽略它是否已经在运行
  • 以某种方式使用 init 脚本(我猜它因发行版而异)

什么方法最有效?

Jde*_*eBP 12

以某种方式使用 init 脚本(我猜它因发行版而异)

确实如此。这是 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

[单元]
Description=Watch /var/spool/example/ 并激活 example-spooler.service
文档=http://unix.stackexchange.com/questions/203637/

[小路]
DirectoryNotEmpty=/var/spool/example/

[安装]
WantedBy=multi-user.target

要在引导时自动启动它,请运行systemctl preset example-spooler.path. 要立即启动,请运行systemctl start example-spooler.path

进一步阅读

  • Lennart Poettering (2013-10-07)。 systemd.path. systemd 手册页。freedesktop.org。


小智 2

假设您的脚本在 Linux 下运行,您可以在 init 脚本中使用inotifywait 。您可能需要对整个下载树进行递归搜索(选项-r)。请记住,每个要监视的节点最多可以占用 1kB 的内核内存

inotify的主要优点是防止代价高昂的轮询循环。一旦受监视的目录树中发生文件操作,它就会触发事件,否则会消耗不明显的 CPU 资源。