五种方法维持远程服务器的session在断开连接后不被中断(详细解释)

简介

  简单来说,SSH或Secure Shell是一种远程访问其他系统上的另一个用户的方法,但只能在命令行即非GUI模式下进行。当我们在远程计算机上运行命令时,它实际上会创建一个伪终端,并将其附加到登录用户的登录shell中。
  当我们退出会话或会话闲置一段时间后超时时,SIGHUP信号将发送到伪终端,并且停止在该终端上运行的所有任务。
  但有时候我们需要程序保持在服务器上运行,此时就需要断开连接后保持程序运行这一技巧了。
  一个常用的命令ps -ef | grep xxx,用于查询当前进程。如查询python执行的程序$ ps -ef | grep python

linux进程

Normal Proces

  正常进程是指具有会话寿命的过程。它们在会话期间作为前台进程启动,并在特定时间段内或会话注销后结束。这些进程的所有者是系统的任何有效用户,包括root。

Orphan Process

  父进程创建进城后,父进程意外终止,从而使init成为该进程的父进程。这样的进程将init作为其直接父级,init等待这些进程死亡或结束。

Daemon Process

  此类进程是一些故意孤立的进程,这些故意留在系统上运行的进程称为守护程序或故意孤立的进程。
  此类进程通常是长时间运行的进程,一旦启动,便会与任何控制终端分离,以便它们可以在后台运行,直到无法完成,否则最终会引发错误。这些进程的父进程有意终止,以便子进程在后台执行。

保持ssh session在断开连接后保持运行的五种方法

1. 使用screen session

  screen是 Linux 的文本窗口管理器,它允许用户

  • 同时管理多个终端会话
  • 在会话之间切换
  • 记录会话运行的输出结果
  • 随时恢复会话,而不必担心会话被注销或终端关闭。

  screen sessions可以在启动后从控制终端分离,从而在后台运行,并可以随时在任何地点恢复。启动screen session后可将其从伪终端(或控制终端)中分离出来。之后重新登录时恢复会话查看运行结果。


步骤

  1. 启动screen session:(连接服务器,)bash键入screen
  2. 此时bash的命令已经不会因为关闭bash而中断
  3. 键入Ctrl+a then d来分离这一段输入的命令。
    此时你可以安心关闭远程连接了
  4. (重新登录服务器)使用screen -r重新打开你的screen session

几个screen常用命令

命令 说明
screen 创建一个screen session
screen -ls 列举当前screen session
screen -list 同上
screen -r [session] 恢复screen session并显示期间输出
ctrl+ a+ d 退出当前screen session
screen -X -S [session] kill kill某个screen session
screen -X -S [session] quit 彻底kill某个screen session
screen -S session -X quit 同上

2. 使用Tmux(Terminal Multiplexer)

  详细了解Tmux用法移步here
  Tmux 作为screen的替代品而生,它具有screen的大部分功能且进行了必要而少量的功能增添,这使得它轻便而强大。
  除了screen提供的所有选项,Tmux允许在多个窗口之间水平或垂直拆分窗格、调整窗口窗格的大小、会话活动监视、使用命令行模式编写脚本等。由于 Tmux 的这些功能十分好用,几乎所有 Unix 发行版广泛内嵌了Tmux。


步骤

  1. 启动Tmux session:(连接服务器,)bash键入tmux
  2. 此时bash的命令已经不会因为关闭bash而中断
  3. 使用tmux detachCtrl+b then d来分离这一段输入的命令。
    此时你可以安心关闭远程连接了
  4. (重新登录服务器)使用tmux attach重新打开你的screen session

3. 使用nohup命令

  使用 nohup 命令,我们告诉进程忽略 ssh 会话在终止时发送的 SIGHUP 信号,从而使命令即使在会话注销后仍会保留。在会话注销时,该命令从控制终端中分行,并作为守护进程在后台继续运行。
语法:

nohup your_command &

回车后会给出一个id,重登录时使用fg %your_id来进入之前的session

4. 使用disown命令

  disdown从系统的流程session列表中删除当前session,因此进程在bash关闭后不会被终止,因为它不会收到 shell 的 SIGHUP。
此方法的缺点是程序不能与stdin和 stdout交互(当然你可以重定向输入和输出),当session尝试与 stdin 或 stdout 交互时,进程就会停止。
语法:

diswon your_command

4. 使用setsid命令

  可以认为setsid时nohup命令的改良版本。nohup 有一个缺点——执行命令的进程组不变,因此使用 nohup 执行的命令容易受到影响,而setsid命令的进程组时可以变化的,规避了nohup的缺点。
语法与nohup类似。
语法:

setsid your_command

需要说明的是,nohup, disdown, setsid都可以重定向输入输出。

猜你喜欢

转载自blog.csdn.net/qq_34769162/article/details/107948168