介绍

介绍

介绍

我最近升级到了 Fedora 17,我正在习惯更新的systemctl守护进程管理器与 shell 初始化脚本。

我的一些守护进程需要的一个功能是与他们的控制台交互因为非由进程本身发起的不正常关闭可能会导致数据库损坏。因此,执行例如systemctl stop service-name.service可能会导致不可逆转的数据丢失。

这些控制台通过 stdin 或类似方法读取用户输入,因此我在旧操作系统上所做的就是将这些守护进程置于会话的前台screen,然后我暂停该屏幕会话^A ^z。还值得注意的是,systemctl如果计算机重新启动,我现在会自动执行此操作,但它仍然无法解决我试图避免的潜在数据损坏问题。


我的问题

有没有办法systemctl直接与它生成的进程的控制台交互?我可以挂接进程systemctl来访问其控制台吗?


谢谢

你们总是能给出很好的答案,所以我向你们求助!

答案1

看起来您可以将其重定向到 tty。

StandardInput=

控制执行进程的文件描述符 0 (STDIN) 连接到哪里。可采用 null、tty、tty-force、tty-fail 或 socket 之一。如果选择 null,标准输入将连接到 /dev/null,即进程的所有读取尝试都将导致立即 EOF。如果选择 tty,标准输入将连接到 TTY(由 TTYPath= 配置,见下文),并且执行的进程将成为终端的控制进程。如果终端已被另一个进程控制,则执行的进程将等待,直到当前控制进程释放终端。tty-force 与 tty 类似,但强制立即使执行的进程成为终端的控制进程,并可能从终端中删除先前的控制进程。tty-fail 与 tty 类似,但如果终端已经有一个控制进程,则执行进程的启动将失败。socket 选项仅在套接字激活的服务中有效,并且仅当套接字配置文件(有关详细信息,请参阅 systemd.socket(5))仅指定单个套接字时才有效。如果设置了此选项,则标准输入将连接到激活服务的套接字,这主要用于与设计用于传统 inetd(8) 守护进程的守护进程兼容。此设置默认为 null。

引用链接

哦,如果这不管用,我们可以用 Unix 套接字做一些非常复杂的事情,我相信你会

别胡说了,如果上面的方法不可接受,就尝试这样的方法:

您可以尝试写入它的 /proc pid 目录。假设您的守护进程的 pid 是 2000,请尝试写入 /proc/2000/fd/0

来源

您可以将该行添加到 ExecStop=,这样您就无需进行任何手动交互。

相关内容