如何在后台设置命令,关闭终端并将其返回到 fg?

Tim*_*nov 10 bash process

我试图找出如何在后台运行命令,然后稍后将其带到前台。我厌倦了人们说它很简单的教程和答案,只需将其附加&到命令的末尾即可使其在后台运行。它仅在单个终端窗口中工作。我想在一个终端中将命令置于后台,并在重新打开终端后将其恢复到前台

例子:

$ grunt &
$ jobs
$ [1]+  Running  grunt &
Run Code Online (Sandbox Code Playgroud)

当然在关闭终端后没有找到任何工作。

下一个例子:

$ grunt & disown #the same behavior has: $ setsid grunt &
$ jobs
$ [nothing] #but ps shows that grunt is working

after close terminal, grunt doesn't work
Run Code Online (Sandbox Code Playgroud)

我做错了什么?任何人都可以解释我如何在后台运行命令并将其返回到前台。

fal*_*ner 17

  1. 安装screen

    sudo apt-get install screen
    
    Run Code Online (Sandbox Code Playgroud)
  2. 开始screen

    screen -S session_name
    
    Run Code Online (Sandbox Code Playgroud)
  3. 执行您需要的命令。

  4. screen从终端分离(您的命令仍将运行):

    CTRL+ a+d

  5. 关闭终端

  6. 打开另一个终端并重新连接上一个screen会话:

    screen -r
    
    Run Code Online (Sandbox Code Playgroud)

欲了解更多信息和额外的选项screen神情man screen

  • Screen 或 byobu(尤其是在运行 ubuntu 时)。如果我是对的,Byobu 是基于屏幕的,但我发现它具有额外的功能,我觉得有用且更易于使用,但这是见仁见智的问题。 (2认同)

sgx*_*gx1 11

你想要的方式是不可能的。

让我们回顾一些基本概念:

  • 进程组是相关进程的集合,这些进程可以同时发出信号。
  • 会话是进程组的集合,这些进程组要么连接到单个终端设备(称为控制终端),要么不连接到任何终端。

如果关闭终端,则会话中的所有进程都已死,除了那些(守护进程)重新指向 init 进程的进程。并且没有办法再次给他们一个控制终端。

总之,进程重父在 POSIX 系统中受到高度限制(守护进程是一个例外),无法满足您的要求。

  • 从技术上讲,这是正确的答案,但我相信遇到此问题的访问者会在其他提到 screen/byobu/tmux 的答案中找到“他们的解决方案”。 (6认同)

use*_*.dz 5

您是否尝试过:byobutmux哪些是终端多路复用器。不完全是你正在寻找的,但它有类似的行为。

byobu-screen
Run Code Online (Sandbox Code Playgroud)

然后运行您的命令,以分离:

byobu-screen -d
Run Code Online (Sandbox Code Playgroud)

恢复:

byobu-screen -r
Run Code Online (Sandbox Code Playgroud)

请参阅https://help.ubuntu.com/community/Screen