写入后台进程的标准input

我在一个Ubuntu 10.04盒子,并通过SSH在后台(myserver&)启动了一个服务器。 它运行良好,但我需要一种方法来获取服务器的标准input,作为控制服务器的唯一方法是通过这种方法。

有没有办法得到一个已经运行的进程的标准input,所以我可以写信给它(希望阅读它的标准输出)? 显然,如果我现在要这样做的话,我会先用FIFOredirect到stdin,但不幸的是现在有点晚了。

有任何想法吗?

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

你可以用一个命名pipe道(fifo)作为input来启动你的服务器:

 mkfifo /tmp/srv-input cat > /tmp/srv-input & echo $! > /tmp/srv-input-cat-pid cat /tmp/srv-input | myserver & 

cat > /tmp/srv-input &对于避免服务器接收EOF很重要。 至less有一个进程必须以书面forms打开FIFO,以便服务器不会收到EOF。 该命令的PID保存在/tmp/srv-input-cat-pid文件中,用于后面的kill。

在你已经启动了你的服务器的情况下,你必须使用一个debugging器(如gdb来连接你的进程,以将它的stdinredirect到fifo:

 gdb -p PID call close(0) call open(0, "/tmp/srv-input", 0600) 

然后做一些像下面的东西发送input到您的服务器(如有必要,在另一个terminal窗口中):

 echo "command" > /tmp/srv-input 

要发送一个EOF到你的服务器,你需要cat > /tmp/srv-input已经保存在/tmp/srv-input-cat-pid filecat > /tmp/srv-input进程。

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

和上面一样,但'猫'不适合我。 该文件得到了EOF,并在发送一个命令后结束。

这对我工作:

 #!/bin/bash mkfifo /tmp/srv-input tail -f /tmp/srv-input | myserver &