Systemd 找不到藍牙服務
我在使用核心 5.15.28-1 的 Manjaro
我的問題與藍牙有關。我有 bluez 5.61-1(我從 5.63-2 降級)。
我可以使用 systemctl 啟動藍牙,但不能從我編寫的 systemd 服務啟動:
#/etc/systemd/system/bt-restart.service [Unit] Description=restart bt and connect keypad [Service] Type=oneshot User=root RemainAfterExit=yes ExecStart=/usr/bin/sleep 1 ExecStart=-/usr/lib/systemd/system/bluetooth ExecStart=/usr/bin/sleep 3 ExecStart=/home/jcw/bin/enable-bt.sh [Install] WantedBy=multi-user.target
輸出自
sudo systemctl status bt-restart
● bt-restart.service - restart bt and connect keypad Loaded: loaded (/etc/systemd/system/bt-restart.service; enabled; vendor preset: disabled) Active: active (exited) since Sat 2022-03-19 09:00:35 CET; 1h 27min ago Process: 2762 ExecStart=/usr/bin/sleep 1 (code=exited, status=0/SUCCESS) Process: 2763 ExecStart=/usr/lib/systemd/system/bluetooth (code=exited, status=0/SUCCESS) Process: 2764 ExecStart=/usr/bin/sleep 3 (code=exited, status=0/SUCCESS) Process: 2766 ExecStart=/home/jcw/bin/enable-bt.sh (code=exited, status=0/SUCCESS) Main PID: 2766 (code=exited, status=0/SUCCESS) CPU: 41ms mars 19 08:59:50 jcw-k30amjafk31amj systemd[1]: Starting restart bt and connect keypad... mars 19 08:59:51 jcw-k30amjafk31amj systemd[2763]: bt-restart.service: Executable /usr/lib/systemd/system/bluetooth missing,> mars 19 09:00:35 jcw-k30amjafk31amj enable-bt.sh[2767]: Attempting to connect to 2B:24:13:DB:7C:99 mars 19 09:00:35 jcw-k30amjafk31amj enable-bt.sh[2767]: Failed to connect: org.bluez.Error.Failed mars 19 09:00:35 jcw-k30amjafk31amj systemd[1]: Finished restart bt and connect keypad.
從Executable /usr/lib/systemd/system/bluetooth missing可以看出,systemd 沒有找到 bluetooth.service。
但該文件存在。可以通過 systemctl 訪問。所以呢?
編輯:第二行的結尾是“缺少執行檔/usr/lib/systemd/system/bluetooth,跳過:沒有這樣的文件或目錄”
目錄中應該沒有執行檔
/usr/lib/systemd/system/
。可能有一個
/usr/lib/systemd/system/bluetooth.service
,但它不是一個執行檔:它只是一個服務定義文件,就像你自己的/etc/systemd/system/bt-restart.service
.儘管您可以
.service
在命令中省略後綴,但systemctl
您不能在ExecStart=
定義中省略任何後綴,因此ExecStart=-/usr/lib/systemd/system/bluetooth
沒有任何意義。即使您指定.../bluetooth.service
了 ,也不能以.service
這種方式啟動文件。如果您只想讓您
bt-restart.service
在bluetooth.service
執行時使用它,您應該在[Unit]
您的部分添加兩行bt-restart.service
:Wants=bluetooth.service After=bluetooth.service
即“
bt-restart.service
需要bluetooth.service
執行(但如果系統在啟動時失敗,系統不應崩潰進入恢復模式),並且bt-restart.service
應該在啟動後bluetooth.service
執行。”那麼你根本不需要這
ExecStart=-/usr/lib/systemd/system/bluetooth
條線。根據您所追求的確切行為,您可能希望使用
BindsTo=
或PartOf=
代替Wants=
.如果您明確希望**在它正在執行時****始終停止
bluetooth.service
**並在您的 中重新啟動它bt-restart.service
,那麼您應該將您的替換ExecStart=-/usr/lib/systemd/system/bluetooth
為:ExecStart=/bin/systemctl restart bluetooth.service
但是,如果您的目標是
enable-bt.sh
每次bluetooth.service
啟動或重新啟動腳本時都執行,那麼組合PartOf=bluetooth.service After=bluetooth.service
應該做的工作。