시스템 서비스에서 사용되지 않은 의사 터미널 쌍을 찾았습니까?

시스템 서비스에서 사용되지 않은 의사 터미널 쌍을 찾았습니까?

내가 서비스 파일을 작성하고 있는 애플리케이션은 STDIN에 연결될 것으로 예상합니다 tty. 즉, 터미널에서 실행될 것으로 예상합니다. Systemd다음 설정을 사용하면 내 응용 프로그램의 문제가 해결되지만 여기서는 tty다른 응용 프로그램에서 이미 사용 중이거나 시스템에 전혀 존재하지 않을 수 있는 정적으로 구성된 경로를 사용하고 있습니다.

StandardInput=tty-force
TTYPath=/dev/tty30

systemd(또는 내가) 사용하지 않는 페어링을 파악하여 pseudoterminal대신 사용할 수 있다면 더 좋을 것입니다.

답변1

에 따르면 man systemd.exec. 찾고 있는 기능이 에 내장되어 있지 않습니다 systemd.

systemd대안으로, 무료 TTY를 찾은 다음 하드코딩된 TTY로 단위 파일을 작성한 다음 systemctl start인스턴트 단위 파일을 호출하는 또 다른 소규모 서비스를 작성할 수 있습니다.

답변2

systemd에 전혀 의존하지 않고 일반적인 script명령을 사용하는 해결 방법을 찾았습니다. 예를 들어:

ExecStart=/usr/bin/script -e -c "/usr/bin/python3 -m http.server" /dev/null

python3할당된 의사 터미널을 사용하여 실행됩니다 script. 복사된 파일은 으로 삭제됩니다 /dev/null.

이전 버전은 script신호를 올바르게 처리하지 못하는 것 같으므로 KillSignal=SIGKILL유사한 패치워크가 필요할 수 있습니다. (2.37.2는 이것이 script없어도 작동합니다 util-linux.)

에서 man script:

-c, --command command
           Run the command rather than an interactive shell. This makes it
           easy for a script to capture the output of a program that behaves
           differently when its stdout is not a tty.

관련 정보