커널 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
일을 해야 합니다.