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