如何将终端附加到分离的进程?

如何将终端附加到分离的进程?

我已经从我的终端分离了一个进程,如下所示:

$ 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

我很确定你不能。

检查使用ps x.如果一个进程有一个?as控制终端,您无法再向其发送输入。

9942 ?        S      0:00 tail -F /var/log/messages
9947 pts/1    S      0:00 tail -F /var/log/messages

在此示例中,您可以发送输入来9947执行类似的操作echo "test" > /dev/pts/19942无法访问其他进程 ( )。

下次你可以使用屏幕或者多路复用器以避免这种情况。

答案4

编辑:正如 Stephane Gimenez 所说,事情没那么简单。它只允许您打印到不同的终端。

您可以尝试使用写入此进程/进程。它应该位于/进程/PID/fd/0,这么简单:

echo "hello" > /proc/PID/fd/0

应该这样做。我没有尝试过,但它应该可以工作,只要这个过程仍然有效标准输入文件描述符。你可以用ls -lon检查它/进程/PID/fd/

  • 如果它是指向 /dev/null => 的链接,则它已关闭
  • 如果它是到 /dev/pts/X 的链接或套接字 => 它是打开的

诺哈普有关如何保持进程运行的更多详细信息。

相关内容