Shell-Script

如何啟動文件處理守護程序?

  • May 16, 2015

如何執行基於腳本的工具,該工具將在文件到達時處理連續下載到給定目錄的文件?我想盡量減少延遲(~1 秒就可以了),腳本可以有自己的無限循環。

我知道幾種方法,例如:

  • 使用.bashrc.profile呼叫我的腳本的自動登錄使用者
  • 來自 cron 的 fork 腳本,如果它已經在執行則忽略它
  • 以某種方式使用初始化腳本(我猜它因發行版而異)

什麼方法最有效?

假設您的腳本要在 Linux 下執行,您可以使用init 腳本中的inotifywait。您可能需要對整個下載樹進行遞歸搜尋(選項-r)。請記住,每個要觀察的節點最多可以佔用 1kB 的核心記憶體

inotify的主要優點是防止昂貴的輪詢循環。只要在監視的目錄樹中發生文件操作,它就會觸發一個事件,否則會消耗不明顯的 CPU 資源。

以某種方式使用初始化腳本(我猜它因發行版而異)

確實如此。這是 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.

進一步閱讀

  • Lennart Poettering (2013-10-07)。 systemd.path. systemd 手冊頁。免費桌面.org。

引用自:https://unix.stackexchange.com/questions/203637