![在 systemd 服务中找到未使用的伪终端对?](https://linux22.com/image/121234/%E5%9C%A8%20systemd%20%E6%9C%8D%E5%8A%A1%E4%B8%AD%E6%89%BE%E5%88%B0%E6%9C%AA%E4%BD%BF%E7%94%A8%E7%9A%84%E4%BC%AA%E7%BB%88%E7%AB%AF%E5%AF%B9%EF%BC%9F.png)
我正在为其编写服务文件的应用程序期望其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.