Systemd 서비스 파일에서 특수 문자가 포함된 echo 명령을 실행하도록 만드는 방법은 무엇입니까?

Systemd 서비스 파일에서 특수 문자가 포함된 echo 명령을 실행하도록 만드는 방법은 무엇입니까?

다음을 실행한 후 아래와 같이 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해야 합니다 .bashbash -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

관련 정보