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-input
PID 已保存在/tmp/srv-input-cat-pid file
.
在 GDB 的情况下,只需退出 GDB,就会发送 EOF。
kat*_*iel 12
您可以尝试写入它的 /proc pid 目录。假设你的守护进程的 pid 是 2000,尝试写入 /proc/2000/fd/0
小智 6
同上,但“猫”对我不起作用。该文件在发送一个命令后得到 EOF 并结束。
这对我有用:
#!/bin/bash
mkfifo /tmp/srv-input
tail -f /tmp/srv-input | myserver &
Run Code Online (Sandbox Code Playgroud)