文章目录
简介
简单来说,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后可将其从伪终端(或控制终端)中分离出来。之后重新登录时恢复会话查看运行结果。
步骤
- 启动screen session:(连接服务器,)bash键入
screen
- 此时bash的命令已经不会因为关闭bash而中断
- 键入
Ctrl+a then d
来分离这一段输入的命令。
此时你可以安心关闭远程连接了 - (重新登录服务器)使用
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。
步骤
- 启动Tmux session:(连接服务器,)bash键入tmux
- 此时bash的命令已经不会因为关闭bash而中断
- 使用
Ctrl+b then d
来分离这一段输入的命令。
此时你可以安心关闭远程连接了 - (重新登录服务器)使用
tmux attach
重新打开你的screen session
3. 使用nohup命令
使用 nohup 命令,我们告诉进程忽略 ssh 会话在终止时发送的 SIGHUP 信号,从而使命令即使在会话注销后仍会保留。在会话注销时,该命令从控制终端中分行,并作为守护进程在后台继续运行。
语法:
nohup your_command &
回车后会给出一个id,重登录时使用fg %your_id
来进入之前的session
4. 使用disown命令
disown从系统的流程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都可以重定向输入输出。