防止当前运行的 linux 任务在从 SSH 注销后被终止

Ali*_*Ali 18 linux ssh shell kill

我有一个计算任务通过 SSH 连接在 linux 服务器上运行了几天。它不在后台,因此 SSH 连接处于任务控制之下。

我想重新启动我打开 ssh 会话的本地机器(不是服务器),但想让任务继续运行。这有可能吗?

jll*_*gre 23

如果你的任务已经启动,为时已晚*考虑其他的解决方案,将您之间的附加层ssh会话和shell中运行命令一样screentmuxbyobunohup和喜欢。

如果要放置在你的后台进程的支持,特别是不挂时stdoutstderr不可写/关闭,你可以把它的背景,在注销前ControlZ,并bg随后从与您的外壳拆下它disown内置。

例如:

$ ssh localhost
You have new mail.
Last login: Fri Jun  6 11:26:56 2014

$ /bin/sleep 3600    


^Z[1] + Stopped                  /bin/sleep 3600
$ bg
[1] /bin/sleep 3600&
$ jobs
[1] +  Running                 /bin/sleep 3600
$ disown %1
$ exit
Connection to localhost closed.
$ ps -ef|grep sleep
jlliagre 12864     1  0 21:12 ?        00:00:00 /bin/sleep 3600
jlliagre 13056 12477  0 21:13 pts/18   00:00:00 grep sleep
$ 
Run Code Online (Sandbox Code Playgroud)

*正如 Bob 所评论的,实际上有几种黑客方法可以在 Linux 下重新设置 tty 会话。repty、rettyinjcodeneercs。最高级的看起来是reptyr,但您可能需要 root 权限才能启用 ptrace 来破解您的进程。

  • 如果您忘记了 bg 命令而只运行了 disown 命令,您应该能够使用 `kill -CONT` 使进程再次运行,这与 bg 的作用大致相同。 (2认同)

Sco*_*don 5

一种解决方案是使用GNU screen。你可以启动screen,运行你的命令,然后用 分离C-a d。稍后,要重新连接,请执行screen -r,然后您将返回上一个会话。

screen 的其他好处是窗口管理(因此您可以在命令运行时切换到其他 shell,而无需新的 SSH 连接),并且它允许您的命令保留在前台,无论是在当前会话中还是在以后的会话中。

编辑:如评论中所述,这仅在您记得screen在运行命令之前启动时才有效。如果命令已经在运行,那么您将需要@jlliagre 的解决方案。

  • `tmux` 是另一个类似于 `screen` 的程序,它允许您拥有一个不依赖于当前 SSH 连接的远程会话。 (2认同)
  • 你的解决方案很棒。但是它并不完全适合我的问题 - 我询问了当前正在运行的进程,而不是将来使用 `screen` 运行的进程。 (2认同)