stdin에 연결된 CLI가 있는 서비스를 실행하고 있습니다. 나는 ssh
기계에 들어갈 때 서비스의 표준 입력에 명령을 보낼 수 있기를 원합니다.
시스템 실행 프로그램StandardInput=file:/path/to/file
그것이 문제라고 말하고 FIFO를 지원합니다. 이것이 가장 쉬운 방법인 것 같습니다.
나는 이미 내 안에 있어요~/.config/systemd/user/foo.service
[Service]
ExecStartPre=mkfifo %t/foo.stdin
ExecStart=cat -
StandardInput=file:%t/foo.stdin
ExecStopPost=rm -f %t/foo.stdin
이 예에서는 다음 명령을 실행하면 로그에 출력이 표시될 것으로 예상합니다.
echo "hello" > /run/user/1000/foo.stdin
이에 대해 두 가지 질문이 있습니다.
foo.service: Failed to set up standard input: No such file or directory
.StandardInput=
이전에도 존재했던 것 같습니다ExecStartPre=
. 설치 중에 고정된 위치에 영구 파이프를 만들어야 합니까, 아니면 해결 방법이 있습니까? 파일을 수동으로 생성하고ExecStartPre
/를 제거하면ExecStopPost
문제가 없습니다.- 첫 번째 것은
echo "command"
잘 처리되지만 하나는 전송되고EOF
stdin은 닫힙니다. 표준 입력이 계속 열려 있기를 원합니다. 답변(exec 3> stdin
, ...,exec 3>&-
)는 bash FD 리디렉션을 사용하는 것 같지만 systemd에서는 사용할 수 없습니다.
답변1
당신은 만들 수 있습니다소켓 유닛FIFO의 경우:
foo.socket
:[Socket] ListenFIFO=%t/foo.stdin Service=foo.service
foo.service
:[Service] ExecStart=/bin/cat - Sockets=foo.socket StandardInput=socket StandardOutput=journal StandardError=journal
다음과 같이 시작하십시오.
systemctl --user start foo.socket
FIFO가 작성되면 서비스 자체가 시작됩니다. 즉시 시작하려면 다음과 같이 시작하십시오.
systemctl --user start foo.service