以下を実行した後、次のようにPCIデバイスのバインドを解除するサービスファイルを作成しようとしますsystemctl stop servicefile-name
。
ExecStop=/bin/echo 1 > "/sys/bus/pci/devices/0000\:03\:00.0/remove"
ただし、バインド解除は発生せず、デバイスはまだアクティブになっています。 Bashコマンドラインからechoコマンドを実行すると問題はなく、デバイスは正常に削除されます。echo 1 > /sys/bus/pci/devices/0000:03:00.0/remove
show echoコマンドを実行すると、systemctl status servicefile-name
エラーなしで実行されます(code=exited, status=0/SUCCESS)
。明らかに、サービスファイルで正しいechoコマンド構文を使用していません。また、エスケープ文字を削除しようとしましたが、まだ機能しません。
ExecStop=/bin/echo 1 > "/sys/bus/pci/devices/0000:03:00.0/remove"
特殊文字「:」を使用して実行時にシステムサービスファイルからデバイスを削除/バインド解除する方法を知っている人はいますか?
答え1
ExecStop=...
実行されませんbash
。したがって、>
orのような演算子は&
bashがどのように解釈されるかとは異なる方法で解釈されます。 systemd
単に実行し、引数として/bin/echo
渡します。1
>
"sys-bus-pci-devices-0000:03:00.0-remove"
>
リダイレクトとして機能するには、このステートメントをインタプリタに渡すbash
必要があります。bash
bash -c
この試み:
ExecStop=/bin/bash -c "/bin/echo 1 > /sys/bus/pci/devices/0000\:03\:00.0/remove"
私はGAD3Rが提案したエスケープについてはよくわかりませんが、文字列をエスケープしてみることもできます。
答え2
使用systemd-escape
。
$ systemd-escape --path "/sys/bus/pci/devices/0000:03:00.0/remove"
sys-bus-pci-devices-0000:03:00.0-remove
次に、ユニットファイルを編集します。
ExecStop=/bin/echo 1 > "sys-bus-pci-devices-0000:03:00.0-remove"
バラよりman systemd-escape