Linux 进程进入后台 - 重新登录 - 如何将进程带回前台?

Linux 进程进入后台 - 重新登录 - 如何将进程带回前台?

我启动了一个进程,让它在后台运行,然后注销,然后再次登录,并想让该进程再次回到前台。我在“ps aux”中查找了 PID,但无法使用“fg ###”将其置于前台。正确的方法是什么?

(我在两次登录会话中使用同一个帐户。)

答案1

最常见的实现方法可能是GNU 屏幕

Screen 是一个全屏窗口管理器,它在多个进程(通常是交互式 shell)之间多路复用一个物理终端。

基本上你会:

  • 确保screen已安装。通常,这是大多数 Linux 发行版上的软件包“ screen”。默认情况下,它会安装在 Mac OS X 上。
  • 执行screen

替代文本

替代文本

  • 运行您希望“后台”运行的程序。例如,我开始跟踪日志文件:

替代文本

  • 按下Ctl-a, d即可分离屏幕。

  • 退出,做其他事情,随便你。这里,我将向日志发送一条消息。

替代文本

  • 再次登录时,键入screen -r以重新附加之前运行的会话。在这里您可以看到我发送到日志的消息(以及之前的测试)。

替代文本

许多人认为 Screen 是 Linux/Unix 上的高级用户工具,我对此也表示赞同!

有关屏幕的更多信息,请参阅其主页或这篇深入的文章Ars Technica

答案2

据我所知,没有直接的方法可以将在另一个 shell 中启动并后台运行的进程置于前台。不过,有几种方法可以解决这个问题。

最好的方法是使用GNU 屏幕。启动屏幕会话,启动进程,从屏幕会话中分离,注销,重新登录,重新连接到屏幕会话。进程仍在运行,屏幕将所有输出保留在窗口缓冲区中。您甚至不需要将其置于后台;您可以让它在一个屏幕窗口中运行,并使用其他窗口执行其他任务。

丑陋的黑客方法是在注销之前将其从终端分离。在 bash 中,disown -h %[jobid]这样做;其他 shell(如 tcsh)会在您退出 shell 时自动为后台进程执行此操作。($[jobid]通过运行命令获取jobs。)您不能直接重新连接到进程,但如果您需要的只是进程的 stdout/stderr/stdin,您可以使用 GDB 伪造重新连接。这是部分操作方法来自这个来源(最初包括在另一个答案):

[...] 通过一些肮脏的黑客手段,重新打开一个进程的 stdout/stderr/stdin 并非不可能。

所以您仍然可以创建一个空白屏幕窗口(例如运行睡眠的窗口)。

然后使用 gdb 例如附加到进程,做一些调用 close(0)
调用 close(1)
调用 close(2)
调用 open(“/dev/pts/xx”, ...)
调用 dup(0)
调用 dup(0)
分离

进程的输出将进入屏幕。它不会附加到该屏幕终端,因此例如 [原文如此] 将终止“睡眠”命令,而不是进程,但这对于 OP 来说已经足够了。

使 bash 自动放弃的一些方法,但它们涉及商店或者禁止或其他 bash 技巧来避免自动 SIGHUP。bash 在这方面不如 tcsh 那么优雅,你必须提前知道你需要这个来设置选项。记住运行否认退出之前完成你的后台工作。

相关内容