systemd 서비스에서 명령의 반환 상태를 무시합니다.

systemd 서비스에서 명령의 반환 상태를 무시합니다.

다음과 같은 문제가 있습니다. fifo 장치 파일을 생성하는 스크립트를 작성 중인데 파일이 이미 존재하더라도 true를 반환하고 싶습니다. 다음 코드 조각도 및 ||에서 FIFO를 생성하려고 시도합니다 /bin/true. mkfifocmd에 마지막 매개변수가 무엇인지 어떻게 알 수 있나요 X?

$ /usr/bin/mkfifo /dev/fifofile || /bin/true

시스템 서비스에서 실행하십시오.

ExecStartPre=/usr/bin/mkfifo /dev/fifofile || /bin/true
Apr 29 08:39:40  mkfifo[27275]: /usr/bin/mkfifo: cannot create fifo '/dev/fifofile': File exists
Apr 29 08:39:40  mkfifo[27275]: /usr/bin/mkfifo: cannot create fifo '||': File exists
Apr 29 08:39:40  mkfifo[27275]: /usr/bin/mkfifo: cannot create fifo '/bin/true': File exists

ExecStartPre으로 변경하려고 하면 ExecStartPre=(/usr/bin/mkfifo /dev/fifofile) || /bin/true다음 오류가 발생합니다.

 Executable path is not absolute: (/usr/bin/mkfifo /dev/gpsfifo) || /bin/true

답변1

ExecStartPre=/usr/bin/mkfifo /dev/fifofile || /bin/true

쉘 명령줄에서는 괜찮지만 systemd는 ExecStartPre쉘을 통해 명령 등을 실행하지 않습니다. ( mkfifo및 경로가 필요한지 잘 모르겠습니다 .)true

이것문서에 따르면저것:

systemd.syntax(5)의 "인용" 섹션에 설명된 규칙을 사용하여 각 명령줄의 인용을 해제합니다. 첫 번째 항목은 실행할 명령이 되고, 그 다음 항목은 매개변수가 됩니다.

구문은 셸 구문에서 영감을 얻었지만 다음 단락에 설명된 메타 문자와 확장만 이해하며 변수는 다르게 확장됩니다. 특히 , 및를 사용하여 리디렉션하고, 파이프를 <사용 하고 , 백그라운드에서 프로그램을 실행합니다.<<>>>|&셸 구문의 다른 요소는 지원되지 않습니다..

그러나 따옴표가 작동해야 하므로 다음과 같은 명령을 사용하여 명시적으로 셸을 실행할 수 있습니다.

ExecStartPre=sh -c 'mkfifo /dev/fifofile || true'. 

그러나 systemd에는 오류를 무시하는 특수 구문이 있으므로 이는 필요하지 않습니다.

실행 파일 경로에 접두사가 붙은 경우 -일반적으로 실패(예: 0이 아닌 종료 상태 또는 신호로 인한 비정상적인 종료)로 간주되는 명령의 종료 코드가 기록되지만 더 이상 효과가 없으며 다음과 동일한 것으로 간주됩니다. 성공.

그래서 그냥

ExecStartPre=-mkfifo /dev/fifofile

해야 할 것.

하지만 리디렉션에 대한 설명에는 >, 대신 2>. 하지만 먼저 파일을 삭제한 다음 다시 만들 수도 있습니다.

ExecStartPre=-rm -f /dev/fifofile
ExecStartPre=-mkfifo /dev/fifofile

물론 이렇게 하면 같은 이름을 가진 다른 파일도 모두 삭제됩니다.

이를 방지하려면 다음과 같이 하십시오.

ExecStartPre=sh -c '[ -p /dev/fifofile ] || mkfifo /dev/fifofile'

파이프가 이미 존재하는 경우 자동으로 종료되어야 하지만 mkfifo파일이 존재하고 아직 파이프가 아닌 경우 오류가 발생합니다.

fifo 파일을 넣을 더 "올바른" 위치가 있을 수 있습니다.

관련 정보