カーネル5.15.28-1でManjaroを使用します。
私の問題はBluetoothに関連しています。私はbluez 5.61-1を使用しています(5.63-2でダウングレードしました)。
systemctlを使用してBluetoothを有効にできますが、私が作成した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を介してアクセスできます。だから何?
編集:2行目は、「実行ファイル/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]
セクションに2行を追加する必要があります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
仕事をしなければなりません。