Systemd

等到 USB 驅動器安裝後才啟動傳輸守護程序?

  • July 18, 2020

我在 OSMC 上將傳輸守護程序作為 systemd 服務執行。重新啟動後打開其遠端控制 Web 界面時,所有傳輸幾乎總是停止並顯示消息“錯誤:未找到數據!確保您的驅動器已連接

$$ … $$”。 我假設這是因為傳輸在下載路徑存在之前開始 - 在這種情況下,在系統自動安裝的 USB 驅動器上,/media/Elements/[...]無需我進行任何手動配置。我沒有編輯fstab

嘗試了這個答案但沒有成功之後,我想知道是否還有其他方法可以解決這個問題?我根據該答案所做的是將以下內容添加到override.conf

cat /etc/systemd/system/transmission.service.d/override.conf

[Unit]
After=media-Elements.mount
After=media-Vault\x2013.mount
After=media-Black\x20Mesa.mount

服務文件:

$ cat /lib/systemd/system/transmission.service

[Unit]
Description=Transmission BitTorrent Daemon
After=udisks-glue.service

[Service]
User=osmc
Group=osmc
Type=notify
ExecStartPre=/bin/sleep 10
ExecStart=/usr/bin/transmission-daemon -f --log-error --allowed *.*.*.*

[Install]
WantedBy=multi-user.target

系統狀態:

$ systemctl status transmission

● transmission.service - Transmission BitTorrent Daemon
  Loaded: loaded (/lib/systemd/system/transmission.service; enabled; vendor preset: enabled)
 Drop-In: /etc/systemd/system/transmission.service.d
          └─override.conf
[...]

值得一提的是,我在每次重啟後Warning: transmission.service changed on disk. Run 'systemctl daemon-reload' to reload units.檢查狀態時都會得到。使其靜音,直到下一次重新啟動。transmission``daemon-reload

這個問題是相關的,但與 fstab 掛載有關。如果可能的話,我寧願在沒有 fstab 的情況下解決它,因為我不想將 USB 驅動器視為永久連接。


嘗試最初的答案後:

$ systemctl cat --no-pager transmission.service
# Warning: transmission.service changed on disk, the version systemd has loaded is outdated.
# This output shows the current version of the unit's original fragment and drop-in files.
# If fragments or drop-ins were added or removed, they are not properly reflected in this output.
# Run 'systemctl daemon-reload' to reload units.
# /lib/systemd/system/transmission.service
[Unit]
Description=Transmission BitTorrent Daemon
After=udisks-glue.service

[Service]
User=osmc
Group=osmc
Type=notify
ExecStartPre=/bin/sleep 10
ExecStart=/usr/bin/transmission-daemon -f --log-error --allowed *.*.*.*

[Install]
WantedBy=multi-user.target

# /etc/systemd/system/transmission.service.d/override.conf

[Unit]
RequiresMountsFor=/media/Elements

[Install]
WantedBy=media-Elements.mount

編輯:事實證明我的第一種方法沒有按預期工作。覆蓋文件上的一個[Install]部分實際上並不工作,並且RequiresMountsFor=似乎只適用於在 fstab 中聲明的掛載。因此,我提出了一個替代方案,它可以實現相同的效果,但使用不同的指令。

為了防止單元在/media/Elements沒有安裝卷的情況下啟動,請使用ConditionPathIsMountPoint=將檢查並阻止單元啟動的指令,除非該目錄已安裝。

# /etc/systemd/system/transmission.service.d/override.conf

[Unit]
ConditionPathIsMountPoint=/media/Elements

(注意:您可以使用該systemctl edit transmission.service命令打開此覆蓋文件的編輯器。)

為了transmission.service在 USB 掛載時觸發啟動,您需要將符號連結添加到.wants/掛載單元的目錄。(理想情況下,這將由一個[Install]部分來處理,但它似乎不適用於覆蓋文件。)

使用以下兩個命令手動創建它:

$ sudo mkdir -p /etc/systemd/system/media-Elements.mount.wants/
$ sudo ln -sf /lib/systemd/system/transmission.service /etc/systemd/system/media-Elements.mount.wants/

就位後,安裝/media/Elements並查看傳輸開始…


下面的原始答案…

所以,該After=指令只影響排序,如果兩個單元都排隊等待啟動,那麼這個單元將在另一個完成後啟動,但不會觸發另一個單元的啟動。你需要Requires=那個。

但是對於 mounts,有一個很好的快捷方式RequiresMountsFor=,可以將 mounts 作為路徑。

您可能還需要進行設置,以便在安裝 USB 驅動器時啟動該設備。您可以通過使用WantedBy=(在該[Install]部分中)並從此處引用該.mount單元來觸發它。在設置並使用systemctl enable創建“想要”關係之後,該單元的啟動將(也)在安裝 USB 驅動器時觸發(如果稍後完成而不是在啟動期間完成。)

把它們放在一起:

# /etc/systemd/system/transmission.service.d/override.conf

[Unit]
RequiresMountsFor=/media/Elements "/media/Vault 13" "/media/Black Mesa"

[Install]
WantedBy=media-Elements.mount
WantedBy=media-Vault\x2013.mount
WantedBy=media-Black\x20Mesa.mount

然後啟用這個單元,它將在*.mount.wants/目錄下創建符號連結(確切的符號連結名稱將列印在systemctl enable輸出中):

# systemctl enable transmission.service

這應該照顧它。

我不清楚您為什麼要列出三個坐騎,因為在您建議的問題文本中僅/media/Elements用於儲存傳輸下載…如果確實如此,您可能可以刪除其他兩個並僅保留參考到“元素”之一。

注意:我在發布之前沒有測試過這一切,但我相當有信心這會奏效。如果由於某種原因它不起作用,請給我留言並提供更多詳細資訊,我很高興與您合作解決這齣來了。)

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