我正在运行一个完全忽略 SIGTERM 的游戏服务器程序 (SRCDS)。彻底关闭服务器的唯一方法是交互式地键入“quit”。
有什么方法可以将该程序包装在一个 bash 脚本中,该脚本将捕获 SIGTERM 并将“退出”发送到程序的 STDIN?否则,在正常操作中,包装器应该转发 STDIN 和 STDOUT,就好像根本不存在一样。
我正在努力实现的图表:
普通手术:
--- STDIN ---> | | --- STDIN ---> | |
| Bash Script | | Server Program |
<-- STDOUT --- | | <-- STDOUT --- | |
SIGTERM 发送:
"quit"
--- STDIN ---> | | --- STDIN ---> | |
-- SIGTERM --> | Bash Script | | Server Program |
<-- STDOUT --- | | <-- STDOUT --- | |
这取决于该程序是否期望从终端运行。如果是,我认为你不能在
bash
; 你应该使用类似的东西expect
。例子:包装器。期望:
以 bc 为例:
kill 4771
来自另一个窗口的 A将导致expect
向 发送quit
一行bc
。请注意,这4771
是expect
进程的 pid,而不是bc
子进程的 pid。另一种选择是使用
TIOCSTI
ioctl 将quit
线路注入当前终端;但是同样,您将无法从外壳中执行此操作;您仍然需要一些小的 C(或 perl、python 等)程序来调用ioctl()
(并且TIOCSTI
已经在 OpenBSD 等系统中被淘汰)。尝试这个:
如果此脚本回答您的问题,我将添加更完整的解释