서비스의 표준 입력에 쓰는 방법

서비스의 표준 입력에 쓰는 방법

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

이에 대해 두 가지 질문이 있습니다.

  1. foo.service: Failed to set up standard input: No such file or directory. StandardInput=이전에도 존재했던 것 같습니다 ExecStartPre=. 설치 중에 고정된 위치에 영구 파이프를 만들어야 합니까, 아니면 해결 방법이 있습니까? 파일을 수동으로 생성하고 ExecStartPre/를 제거하면 ExecStopPost문제가 없습니다.
  2. 첫 번째 것은 echo "command"잘 처리되지만 하나는 전송되고 EOFstdin은 닫힙니다. 표준 입력이 계속 열려 있기를 원합니다. 답변( 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

관련 정보