내가 서비스 파일을 작성하고 있는 애플리케이션은 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.