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

Jon*_*nny 5 linux process

我启动一个进程,把它放在后台运行,然后注销,然后再次登录,并想再次将进程带到前台。我已经在“ps aux”中查找了 PID,但它不会用“fg ###”放在前台。正确的方法是什么?

(我对两个登录会话使用相同的帐户。)

jti*_*man 9

实现这一点的最常见方法可能是使用GNU Screen

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

基本上你会:

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

替代文字

替代文字

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

替代文字

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

  • 注销,做其他事情,随心所欲。在这里,我将向日志发送一条消息。

替代文字

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

替代文字

许多人认为 Screen 是 Linux/Unix 上的高级用户工具,我倾向于同意!

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


qua*_*ote 5

AFAIK 没有直接的方法可以将在另一个 shell 中启动和后台运行的进程置于前台。但是,有几种方法可以解决这个问题。

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

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

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

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

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

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

一些方法可以让 bash 自动拒绝,但它们涉及shoptsnohup或其他 bash 技巧来避免自动 SIGHUP。bash 在这方面不如 tcsh 优雅,您必须提前知道您需要它来设置选项。在退出之前记住在后台作业上运行disown 会更容易一些。