Systemd

Systemd 找不到藍牙服務

  • March 19, 2022

我在使用核心 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.servicebluetooth.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

應該做的工作。

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