我已经从我的终端分离了一个进程,如下所示:
$ process &
该终端现在已关闭很长时间,但process
仍在运行,我想向该进程的标准输入发送一些命令。那可能吗?
答案1
是的。首先,创建一个管道:
mkfifo /tmp/fifo
。使用 gdb 附加到进程:
gdb -p PID
然后关闭标准输入:call close (0)
;并再次打开它:call open ("/tmp/fifo", 0600)
最后,写掉(从不同的终端,因为 gdb 可能会挂起):
echo blah > /tmp/fifo
答案2
当原始终端无法再访问时...
reptyr
可能是你想要的,看看https://serverfault.com/a/284795/187998
引用那里:
看一下雷普特尔,它正是这样做的。 github 页面包含所有信息。reptyr - 用于“重新编译”程序的工具。
reptyr 是一个实用程序,用于获取现有正在运行的程序并将其附加到新终端。通过 ssh 启动了一个长时间运行的进程,但必须离开并且不想中断它?只需启动一个屏幕,使用reptyr 抓取它,然后终止 ssh 会话并回家即可。
用法
雷普特尔PID
“reptyr PID”将抓取具有 id PID 的进程并将其附加到您当前的终端。
连接后,该进程将从新终端获取输入并将输出写入新终端,包括 ^C 和 ^Z。 (不幸的是,如果您将其设置为后台,您仍然需要在旧终端中运行“bg”或“fg”。如果不修补 shell,这可能无法以合理的方式修复。)
编辑声称“reptyr
无法获取具有子进程的进程。或子进程(reptyr 版本 0.6.2)。”确实存在有限的支持问题,问题
答案3
答案4
编辑:正如 Stephane Gimenez 所说,事情没那么简单。它只允许您打印到不同的终端。
您可以尝试使用写入此进程/进程。它应该位于/进程/PID/fd/0,这么简单:
echo "hello" > /proc/PID/fd/0
应该这样做。我没有尝试过,但它应该可以工作,只要这个过程仍然有效标准输入文件描述符。你可以用ls -l
on检查它/进程/PID/fd/。
- 如果它是指向 /dev/null => 的链接,则它已关闭
- 如果它是到 /dev/pts/X 的链接或套接字 => 它是打开的
看诺哈普有关如何保持进程运行的更多详细信息。