是否可以将进程与其终端分离?(或者,“我应该使用屏幕!”)

mik*_*ike 162 linux unix gnu-screen

可能的重复:
我可以 nohup/screen 一个已经启动的进程吗?

在 Unix(特别是 Linux)上,我在常规 ssh->bash 会话中开始了一项工作。我想尽快下班,但我现在意识到这项工作需要几个小时。

如果我刚刚在银幕上开始这项工作,我可以分离回家。但我没有。

有什么方法可以断开作业与其 ssh 会话的连接,这样我就可以关闭我的计算机(断开 TCP 连接并终止 ssh 会话),并且程序继续运行?

我不在乎它的输出——事实上,我将 stdout 重定向到了一个文件。我只是想让它运行完成。

Dav*_*ley 223

您可以按ctrl-z中断进程,然后运行bg使其在后台运行。

您可以使用jobs.

然后您可以运行disown %1(替换1为由 输出的进程号jobs)以将进程与终端分离。

尽管名称如此,但运行后该进程仍将归您所有disown,它只会与您启动它的终端分离。

这个答案有更多信息

  • 尝试这个程序有多安全?有什么问题吗? (2认同)
  • `jobs -l` 列出 `disown` 所需的进程号 - CentOS 上的输出中不包含进程号 (2认同)

小智 20

我相信您正在寻找的命令是“disown”


小智 17

用
nohup 命令 &

是美丽的:
root@index:~# nohup /usr/bin/curl localhost/begemot.php &
[1] 894
root@index:~# nohup: 忽略输入并将输出附加到 `nohup.out'

并退出此终端,继续进行任务...

  • 工作已经开始。如果时间机器运行良好,这是正确的答案。 (7认同)
  • 在这种情况下仍然是一个有用的贡献,无论如何对我们凡人来说。迪克评论。 (3认同)

Joe*_*Joe 8

从你的 bash shell 中:

control+z
Run Code Online (Sandbox Code Playgroud)

然后,继续在后台运行作业:

bg
Run Code Online (Sandbox Code Playgroud)

稍后,您可以键入 jobs 以查看您的进程是否仍在运行。

  • 当您关闭 shell 时,上述说明将导致进程退出。您还需要运行“disown”命令/内置命令(这是在 bash 中),这将使进程与 shell 分离,并且不会在退出时向进程发送 HUP 信号。 (14认同)
  • 当我关闭我的外壳时它不会被杀死吗? (2认同)
  • 在我的 bash [3.2.25(1)-release (i686-redhat-linux-gnu)] 版本上,我测试了该进程,并且在断开连接之前不必放弃该作业。子 PID 与父 PID 断开连接,并以我的用户名继续运行,不间断。YMMV,我想。 (2认同)

小智 8

在屏幕内使用reptyr 时,您可以将进程(或其输出)移动到屏幕中。


Dav*_*ett 6

screen当我连接到我经常使用的主机时,我已经开始设置为自动运行,以避免这个问题。

http://tlug.dnho.net/?q=node/239是一种方法,尽管还有其他变化。

当我在会话期间意外断开连接时,已经救了我一两次,否则screen我会在开始冗长的事情之前忘记开始。


rad*_*ius 5

在运行命令时使用 crtl-Z 然后使用 bg 或使用 & 在 100% 时不可靠。它在大多数情况下都可以工作,但在某些情况下可能无法按预期工作(I/O 使用,...)。
Screen 是一个可靠的解决方案。

  • 请注意,retty (http://pasky.or.cz/~pasky/dev/retty/) 是一种工具,可以让您将在屏幕外运行的进程移动到屏幕中。如果您忘记了,将您的工作放在屏幕上会很有用。然后,您可以安全地分离屏幕,而不会出现作业停止的任何风险。 (3认同)