写入后台进程的标准输入


25

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

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

有任何想法吗?


您不能只是将其带回前台吗?('jobs'将列出您当前的后台进程,'fg $ X'将使该工作回到前台,ctrl + b将暂停该工作并将您返回到您的shell,而'bg'将继续在该进程中背景)
symcbean

Answers:


10

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


谢谢...我在发布此书后(经过一天的浏览-典型)就发现了这一点。这似乎可行(就实际向程序发送数据而言)。不幸的是,该程序不接受命令。我测试了它在本地计算机上运行服务器的过程,并且确实可以看到数据出现,但是程序无法识别命令。我必须手动在服务器终端上按Enter键,然后它说无法识别的命令。也许有些java怪异?我被卡住了……
tajmorton

1
echo -e“ something \ n”> / proc / 2000 / fd / 0怎么样?
katriel 2010年

实际上,这并不总是可行,因为/ proc / <pid> / fd / 0至少在某些系统上指向/ dev / pts <some number> ...
bk138 2015年

serverfault.com/questions/178457/…的第一个答案指出该方法实际上不起作用。
barrycarter 2015年

2
这实际上是行不通的。您的外壳程序通常(不使用管道或重定向时)0通过2将文件描述符设置为同一文件来启动命令,该文件通常是虚拟终端(类似/dev/pty/...)。然后,该命令从FD 读取0写入 FD,12与虚拟终端通信(例如,通过SSH或直接与终端仿真器通信)。如果有任何其他进程(例如,通过/proc)访问该文件,则会发生完全相同的事情,即写入该文件将写入终端,而不是命令。
Feuermurmel

29

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

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

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)

然后执行下面的类似操作,将输入发送到服务器(如果需要,在另一个终端窗口中):

echo "command" > /tmp/srv-input

要将EOF发送到您的服务器,您需要取消cat > /tmp/srv-input已将PID保存在中的进程/tmp/srv-input-cat-pid file

对于GDB,只需退出GDB,就会发送EOF。


1
这是一种比@katriel更具移植性的方法,因为/ proc / 2000 / fd / 0并非在所有系统上都是stdin。
2015年

“ cat> / tmp / srv-input&”的把戏使我头疼。谢谢!
2015年

mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &呢 这也会使管道保持打开状态
bk138

@ bk138:在我看来尾巴应该可以工作,但是只有一种方法可以确定:测试。
jfg956

tail不起作用,但将其附加以完成工作:cat /tmp/srv-input | myserver; kill -9 cat / tmp / srv-input-cat-pid` && rm / tmp / srv-input-cat *`
Thiago Macedo

4

与上面相同,但是“ cat”对我不起作用。该文件获得EOF并在发送一条命令后结束。

这为我工作:

#!/bin/bash

mkfifo /tmp/srv-input
tail -f /tmp/srv-input | myserver &
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.