SSH或安全Shell简单来说就是一个人可以远程访问其他用户的其他系统,但仅在命令行即非GUI模式的方法。 在更多的技术术语中,当我们ssh到其他用户在某些其他系统上并在该机器上运行命令时,它实际上创建一个伪终端并将其附加到登录用户的登录shell。
断开连接后SSH会话运行的5种方法
当我们退出会话或会话超时闲置一段时间后,将SIGHUP信号发送到伪终端以及所有已在该终端上运行的作业,甚至有自己的父作业的作业在伪终端上发起的也被发送SIGHUP信号并被强制终止。
只有配置为忽略此信号的作业才能在会话终止后生存。 在Linux系统上,我们可以有许多方法使这些作业在远程服务器或任何计算机上运行,即使在用户注销和会话终止之后。
了解Linux上的进程
正常过程
正常过程是具有会话的寿命的过程。 它们在会话期间作为前台进程启动,并在特定时间跨度或在会话注销时结束。 这些进程的所有者是系统的任何有效用户,包括root用户。
孤立进程
孤立进程是最初有父进程创建进程的进程,但在一段时间后,父进程无意中死亡或崩溃,使init成为该进程的父进程。 这样的进程使init作为其直接父进程,等待这些进程直到它们死亡或结束。
守护进程
这些是一些有意孤立的进程,这些有意在系统上运行的进程称为守护程序或有意孤立的进程。 它们通常是长时间运行的进程,它们一旦启动,然后从任何控制终端分离,以便它们可以在后台运行,直到它们没有完成,或者最终引发错误。 这种过程的父母故意使孩子在后台执行。
断开连接后保持SSH会话运行的技术
在断开连接后,可以有多种方法使ssh会话运行,如下所述:
1.使用屏幕命令保持SSH会话运行
屏幕是Linux的一个文本窗口管理器,它允许用户管理在同一时间多个终端会话,会话之间切换,会话日志记录在屏幕上运行会议,甚至可以恢复届,我们无需担心会话所需的任何时间被记录输出或端子闭合。
屏幕会话可以开始,然后从控制终端分离,使它们在后台运行,然后在任何时间甚至在任何地方恢复。 只需要在屏幕上启动会话,并在需要时将其从伪终端(或控制终端)分离并注销。 当你感觉到,你可以重新登录并恢复会话。
启动屏幕会话
键入“屏幕”命令后,你将在一个新的屏幕会话,本次会议中,您可以创建新的窗口,遍历窗口之间,锁定屏幕,并做更多的东西,你可以正常的终端上做的。$ screen
在Linux中启动屏幕会话
一旦屏幕会话启动,您可以运行任何命令,并通过分离会话来保持会话运行。
在屏幕会话中运行命令
分离屏幕
只是当你想退出远程会话,但你想保持在该机器上创建的会话活着,那么你只需要做的是将屏幕从终端分离,以便它没有控制终端。 这样做后,您可以安全地注销。
从远程终端分离屏幕,只要按下“Ctrl+a”后面紧跟着“d”您将回到码头看到,屏幕上是分离的消息。 现在您可以安全地注销,您的会话将保持活动状态。
分离Linux屏幕会话
恢复分离屏幕会话
如果你想恢复您注销前留下了分离屏幕会话,只需再次重新登录到远程终端输入“screen -r”如果只有一个屏幕打开的情况下,如果多屏会被打开运行“screen -r ”$ screen -r
$ screen -r
恢复分离屏幕会话
要了解更多关于屏幕的命令,以及如何使用它只是按照链接: 使用屏幕命令管理Linux终端会话
2.使用Tmux(终端复用器)保持SSH会话运行
TMUX是创建的,是用于屏幕更换另一个软件。 它拥有的大部分屏幕的能力,很少有额外的功能,这使得它比屏幕上更强大。
除了屏幕提供的所有选项之外,它允许在多个窗口之间水平或垂直分割窗格,调整窗口窗格大小,会话活动监视,使用命令行模式的脚本等。由于tmux的这些特性,它已被近乎所有的Unix发行版,甚至已经包含在OpenBSD的基本系统中。
启动Tmux会话
在远程主机并输入TMUX做SSH之后,你将进入一个新的会话使用一个新窗口打开在你的面前,其中你可以做任何你一个正常的终端上完成。$ tmux
启动tmux终端会话
在终端上执行操作后,您可以从控制终端分离该会话,使其进入后台,您可以安全地注销。
在Tmux会话中执行Linux命令
从终端分离Tmux会话
要么你可以运行“tmux detach”运行TMUX会话,也可以使用快捷键(Ctrl+b then d) 之后,您当前的会话将分离,您将回到您的终端,从那里你可以安全地注销。$ tmux detach
在Linux中分离Tmux会话
恢复关闭的Tmux会话
要重新打开会话,你超脱,保持不变,当你退出系统,只需重新登录到远程计算机,然后键入“TMUX重视”重新连接到关闭会话,它将会依然存在并运行。$ tmux attach
恢复Tmux关闭会话
要了解更多关于TMUX以及如何使用它只是按照链接: 使用TMUX终端复用器管理多个Linux的终端 。
3.使用nohup命令保持运行SSH会话
如果您不熟悉的屏幕或TMUX,你可以使用的nohup和发送你的长期运行的命令的背景,这样就可以继续,而该命令将继续在后台执行。 之后,您可以安全地注销。
随着nohup命令我们告诉这个过程要忽略的是通过SSH会话发送终端上,从而使该命令的SIGHUP信号坚持,即使会话注销后。 在会话注销时,命令从控制终端中被取消,并作为守护进程在后台继续运行。
在后台使用nohup执行命令
在这里,是一个简单的场景,其中,我们已经运行find命令来搜索文件使用的nohup上的SSH会话背景,在此之后,任务被送到背景提示返回,立即给PID和过程作业ID ([JOBID] PID) 。# nohup find / -type f $gt; files_in_system.out 2>1 &
在后台运行Linux命令
恢复会话以查看作业是否仍在运行
当您再次重新登录,您可以检查命令的状态,通过将其带回前台'fg %JOBID'来监测其进展情况等。 下面,输出显示作业已完成,因为它在重新登录时不显示,并已给出显示的输出。# fg %JOBID
在后台运行Linux命令
4.使用disown命令保持SSH会话运行
即使会话注销后让你的命令,或者在后台单任务运行和另一种优雅的方式仍然存活或断开是使用不认 。
不认 ,从系统中删除的处理作业列表中的作业,所以这个过程是从会话断开时被杀害,当您注销它不会被shell收到SIGHUP屏蔽。
这种方法的缺点是,它应该只对那些不需要从标准输入既不需要任何输入写入到标准输出的作业中使用的,除非你专门重定向作业的输入和输出,因为当作业将尝试使用标准输入交互或标准输出 ,这将暂停。
使用后台禁用执行命令
下面,我们发送ping命令来背景,使UT不断运行,并会从任务列表中删除。 可以看出,这项工作首先暂停后,它仍然在工作清单进程ID:15368。$ ping howtoing.com > pingout &
$ jobs -l
$ diswon -h %1
$ ps -ef | grep ping
使用Disown运行Linux命令
之后,拒绝信号传递到作业,并从作业列表中删除,虽然仍然在后台运行。 当您重新登录到远程服务器时,作业仍将运行,如下所示。$ ps -ef | grep ping
验证作业状态
5.使用setsid命令使SSH会话运行
另一个实用程序来实现所要求的行为setsid。NOHUP具有意义上的缺点,即该过程的进程组保持相同,以便与nohup的运行过程是易受发送到的整个过程组的任何信号(例如Ctrl + C ) 。
在另一方面setsid分配正在执行一个新的进程组的进程,因此,创建的过程完全是在一个新分配的进程组,可以不用担心,甚至会注销后被杀安全地执行。
使用setsid执行任何命令
这里,它示出了该过程'sleep 10m'已经从控制终端拆下,由于时间已经创建。$ setsid sleep 10m
$ ps -ef | grep sleep
使用Setsid运行Linux命令
现在,当您重新登录会话时,您仍然会发现此进程正在运行。$ ps -ef | grep [s]leep
Linux进程运行背景
结论
你可以想到什么方法来保持你的进程运行,即使你从SSH会话注销? 如果有任何其他和有效的方式,你可以想到,请在你的评论中提及。