写入后台进程的标准输入

taj*_*ton 31 linux bash background-process stdin

我在 Ubuntu 10.04 机器上,并通过 ssh 在后台 (myserver &) 启动了一个服务器。它一直运行良好,但我需要一种方法来获取服务器的标准输入,因为控制服务器的唯一方法是通过这种方法。

有什么方法可以获取已经运行的进程的标准输入,以便我可以写入它(并希望读取它的标准输出)?显然,如果我现在要这样做,我会从重定向到标准输入的 FIFO 开始,但不幸的是,现在这样做有点晚了。

有任何想法吗?

jfg*_*956 34

您可以使用命名管道 (fifo) 作为其输入来启动服务器:

mkfifo /tmp/srv-input
cat > /tmp/srv-input &
echo $! > /tmp/srv-input-cat-pid
cat /tmp/srv-input | myserver &
Run Code Online (Sandbox Code Playgroud)

cat > /tmp/srv-input &避免你的服务器收到一个EOF是很重要的。至少有一个进程必须以书面形式打开 fifo,这样您的服务器就不会收到 EOF。该命令的PID保存在/tmp/srv-input-cat-pid文件中,以备后用。

在您已经启动服务器的情况下,您必须使用调试器,例如gdb附加到您的进程以将其重定向stdin到 fifo:

gdb -p PID
call close(0)
call open(0, "/tmp/srv-input", 0600)
Run Code Online (Sandbox Code Playgroud)

然后执行如下操作以将输入发送到您的服务器(如有必要,在另一个终端窗口中):

echo "command" > /tmp/srv-input
Run Code Online (Sandbox Code Playgroud)

要将 EOF 发送到您的服务器,您需要终止cat > /tmp/srv-inputPID 已保存在/tmp/srv-input-cat-pid file.

在 GDB 的情况下,只需退出 GDB,就会发送 EOF。

  • 这是一种比来自@katriel 的方法更便携的方法,因为 /proc/2000/fd/0 不是所有系统上的标准输入。 (2认同)

kat*_*iel 12

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

  • 这实际上不起作用。你的 shell 通常(当没有使用管道或重定向时)启动一个命令,文件描述符从 `0` 到 `2` 设置为相同的文件,通常是一个虚拟终端(类似于 `/dev/pty/...` )。该命令然后从 FD `0` _reads_ 并_writes_ 到 FD `1` 和 `2` 以与虚拟终端通信(例如通过 SSH 或直接与您的终端模拟器)。如果任何其他进程访问该文件(例如通过`/proc`),就会发生完全相同的事情,即 _writing_ 写入终端而不是命令。 (5认同)

小智 6

同上,但“猫”对我不起作用。该文件在发送一个命令后得到 EOF 并结束。

这对我有用:

#!/bin/bash

mkfifo /tmp/srv-input
tail -f /tmp/srv-input | myserver &
Run Code Online (Sandbox Code Playgroud)