(让程序在linux下持续运行)五种方法维持远程服务器的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] killkill某个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. 使用Ctrl+b then d来分离这一段输入的命令。
    此时你可以安心关闭远程连接了
  4. (重新登录服务器)使用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都可以重定向输入输出。

Linux环境下,确保Python脚本能够在用户断开SSH会话后依然在后台稳定运行,需要采取特定的策略以保持进程的持续运行。首先,直接在命令行中使用`&`操作符虽然可以将Python脚本放到后台执行,但这种方式具备持久性,一旦SSH会话结束,脚本将随之终止。因此,需要利用更为持久化的方法来确保脚本的连续运行。 参考资源链接:[LinuxPython脚本后台运行方法:fork、upstart、bash、screen与tmux](https://wenku.csdn.net/doc/6401abd5cce7214c316e9ab9?spm=1055.2569.3001.10343) 1. **使用`nohup`命令结合重定向**:通过在Bash脚本中使用`nohup`命令,例如编写一个`run_script.sh`脚本,内容为`nohup python your_script.py > /dev/null 2>&1 &`,这样即使SSH会话结束,`nohup`也能确保脚本继续运行,并将所有输出重定向到null设备,避免因输出而终止。 2. **创建守护进程**:在Python脚本中使用`os.fork()`来创建一个守护进程。这种方法需要在Python脚本中添加代码,让其在后台运行,并与原始终端分离。 3. **配置Upstart服务**:编写一个Upstart配置文件,如`your_script.conf`,并将其放置于`/etc/init/`目录下。文件中定义了启动和停止脚本的命令以及执行用户等信息。通过Upstart来管理脚本运行,可以让其作为系统服务持续运行依赖于用户的登录会话。 4. **利用`screen`或`tmux`工具**:这些工具允许你在断开连接后重新连接到之前的会话。例如,使用`screen`时,可以先运行`screen -S session_name`创建一个会话,然后在其中运行你的脚本。即使SSH会话结束,脚本依然在`screen`会话中运行,之后可以通过`screen -r session_name`命令重新连接到脚本会话继续工作。 综上所述,确保Python脚本在用户断开SSH会话后依然在后台稳定运行,可以通过使用`nohup`命令、创建守护进程、配置Upstart服务或使用`screen`和`tmux`工具来实现。根据你的具体需求选择最合适的方案,可以有效保证脚本的稳定运行。为了更深入地了解这些方法,建议参考资料《LinuxPython脚本后台运行方法:fork、upstart、bash、screen与tmux》。这份文档详细介绍了各种方法的原理和使用方法,可以为你解决后台运行脚本的问题提供更全面的指导。 参考资源链接:[LinuxPython脚本后台运行方法:fork、upstart、bash、screen与tmux](https://wenku.csdn.net/doc/6401abd5cce7214c316e9ab9?spm=1055.2569.3001.10343)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值