Systemd가 Bluetooth 서비스를 찾을 수 없습니다

Systemd가 Bluetooth 서비스를 찾을 수 없습니다

커널 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 상태 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.

보시다시피실행 파일 /usr/lib/systemd/system/bluetooth가 없습니다., systemd가 bluetooth.service를 찾지 못했습니다.

하지만 파일이 존재합니다. systemctl을 통해 접근할 수 있습니다. 그래서 뭐?

편집: 두 번째 줄은 "실행 파일 /usr/lib/systemd/system/bluetooth가 누락되었습니다. 건너뛰는 중: 해당 파일이나 디렉터리가 없습니다"로 끝납니다.

답변1

디렉토리에는 실행 파일이 없어야 합니다 /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실행 중인 경우 항상 중지했다가 다시 시작하세요.yours 에서는 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

일을 해야 합니다.

관련 정보