Shell-Script
如何啟動文件處理守護程序?
如何執行基於腳本的工具,該工具將在文件到達時處理連續下載到給定目錄的文件?我想盡量減少延遲(~1 秒就可以了),腳本可以有自己的無限循環。
我知道幾種方法,例如:
- 使用
.bashrc
或.profile
呼叫我的腳本的自動登錄使用者- 來自 cron 的 fork 腳本,如果它已經在執行則忽略它
- 以某種方式使用初始化腳本(我猜它因發行版而異)
什麼方法最有效?
假設您的腳本要在 Linux 下執行,您可以使用init 腳本中的inotifywait。您可能需要對整個下載樹進行遞歸搜尋(選項
-r
)。請記住,每個要觀察的節點最多可以佔用 1kB 的核心記憶體。inotify的主要優點是防止昂貴的輪詢循環。只要在監視的目錄樹中發生文件操作,它就會觸發一個事件,否則會消耗不明顯的 CPU 資源。
以某種方式使用初始化腳本(我猜它因發行版而異)
確實如此。這是 systemd 方式,它根本不涉及 System 5
rc
腳本。是兩個單位。因為它們是非封裝的非系統單元,所以它們進入/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
.進一步閱讀
- Lennart Poettering (2013-10-07)。
systemd.path
. systemd 手冊頁。免費桌面.org。