等到 USB 驅動器安裝後才啟動傳輸守護程序?
我在 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
用於儲存傳輸下載…如果確實如此,您可能可以刪除其他兩個並僅保留參考到“元素”之一。(注意:我在發布之前沒有測試過這一切,但我相當有信心這會奏效。如果由於某種原因它不起作用,請給我留言並提供更多詳細資訊,我很高興與您合作解決這齣來了。)