在 systemd 服务中找到未使用的伪终端对?

在 systemd 服务中找到未使用的伪终端对?

我正在为其编写服务文件的应用程序期望其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.2script没有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.

相关内容