实现关闭ssh继续运行程序---tmux

问题1:为什么ssh一关闭,程序就不再运行了

元凶:SIGHUP 信号

让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。

在Linux/Unix中,有这样几个概念:

进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。

会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。

会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。

根据POSIX.1定义:

挂断信号(SIGHUP)默认的动作是终止程序。

当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。

如果会话期首进程终止,则该信号发送到该会话期前台进程组。

一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。

结论:因此当网络断开或终端窗口关闭后,也就是SSH断开以后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。

简而言之:就是ssh 打开以后,bash等都是他的子程序,一旦ssh关闭,系统将所有相关进程杀掉! !导致一旦ssh关闭,执行中的任务就取消了

例子:

我们来看一个例子。打开两个SSH终端窗口,在其中一个运行top命令。

在另一个终端窗口,找到top的进程id为12912,父进程Id为12825,即登陆shell

使用pstree命令可以更清楚地看到这个关系:

使用ps-xj命令可以看到,登录shell(PID 12912)和top在同一个会话期,shell为会话期首进程,所在进程组PGID为12825,top所在进程组PGID为12912,为前台进程组。

关闭第一个SSH窗口,在另一个窗口中可以??看到top也被杀掉了。

问题2:为什么守护进程就算ssh打开的,就算关闭ssh也不会影响其运行?

因为他们的程序特殊,比如

运行这个以后,他不属於sshd这个进程组 而是单独的进程组,所以就算关闭了ssh,和他也没有任何关系!!

结论:守护进程的启动命令本身就是特殊的,和一般命令不同的

比如mysqld_safe 这样的命令 一旦使用了 就是守护进程运行

所以想把一般程序改造为守护程序是不可能的

问题3 使用后台运行命令& 能否将程序摆脱ssh?

我们做一个实验:

利用ctrl+d 注销以后 再进入系统 会不会看见这个命令再运行?

答案是 :命令被中止了!!

因为他依然属於这个ssh进程组 就算加了&也无法摆脱!!

问题4 nohup能解决的问题

但是为了能够再注销以后 依然能后台运行,那麼我们就可以使用nohup这个命令,我们现在开始查找find / -name ‘http’ &

,并且希望在后台能够定期运行,

那麼就使用nohup:

嗯,证明运行成功,同时把程序运行的输出信息放到当前文件夹的 nohup.out 文件中去。

然后我们马上退出

再进去 打开vim nohup.out 果然信息都在

那么现在我运行一个比较长的搜索:

再退出 再进去 打开vim nohup.out 发现 原来 是默认迭加再后面得 信息 看看 的确 执行了:

加不加&并不会影响这个命令 只是让程序 前台或者后台运行而已

可以使用tmux或者screen来保证ssh断开之后能继续运行程序,

我个人推荐使用tmux,因为screen的子界面和父界面没有任何不同,很容易出错。但是tmux不一样,在子界面中执行tmux只有会抛出错误信息:

而且tmux还能实现分屏功能:

以下是我的.tmux.conf:

unbind C-b
set -g prefix C-a
setw -g mode-keys vi

set -g default-terminal "screen-256color" # use 256 colors
set -g display-time 5000 # status line messages display
set -g status-utf8 on # enable utf-8
set -g history-limit 100000 # scrollback buffer n lines

# split window like vim
# vim‘s defination of a horizontal/vertical split is revised from tumx‘s
unbind %
bind s split-window -h
unbind ‘"‘
bind v split-window -v
# move arount panes wiht hjkl, as one would in vim after C-w
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
时间: 2024-10-03 20:39:19

实现关闭ssh继续运行程序---tmux的相关文章

linux后台运行程序(secureCRT断掉或关闭后继续运行程序)

secureCRT断掉后想继续运行程序.也就是程序会在后台一直执行到结束. secureCRT通过ssh联接到client端运行程序,如果关掉窗口或者断开连接时,任务会被kill. 为了程序能够后台执行到结束: 1.可以用&: 比如 python test.py 改成 python test.py & 来调用执行. 2.另外,还有一种方式:通过ctrl+z.bg等一系列的命令,将已经在前台运行的作业放到后台执行: 如果一个作业已经在前台执行,可以通过ctrl+z将该作业放到后台并挂起.然后

实现关闭ssh继续实施方案---tmux

问题1:为什么ssh一个关闭.不再执行的程序 罪魁祸首:SIGHUP 信号 让我们来看看为什么关掉形式/断开将使程序被执行死. 在Linux/Unix在.有几个概念: 进程组(process group):一个或多个进程的集合,每个进程组有唯一一个进程组ID,即进程组长进程的ID. 会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader).会话期ID为首进程的ID. 会话期能够有一个单独的控制终端(controlling terminal).与控制

如何让linux程序在ssh shell关闭后继续运行?

我们经常会碰到一种情况,用ssh远程登录到linux服务器后,启动一个脚本跑任务,如果这个任务耗时比较久,就得等着,如果此时由于网络原因,ssh连接断了,再重新登录服务器,原来的任务就没了,得重新运行一次.有没有办法让任务切到后台,ssh退出后还能继续运行呢? 当然有-,而且很简单: 1. 在ssh shell中运行脚本,比如我运行一个批量下载脚本: python download-app-annie.py 2. 按下ctrl-z中断脚本运行,此时系统提示: ^Z [1]+  Stopped  

Linux关闭终端(或者关闭SSH等)后运行的程序自动停止

问题描述: 之前在服务器上起一个python的服务,放到后台运行. python pyserver.py &.  当我关闭这个SSH之后,该服务不可用,再次登入到服务器,已经没有这个python进程啦. 问题定位: 通过上面问题的表象,可以发现是跟SSH关闭有关.为什么ssh关闭,会导致正在运行的程序死掉.通过查看相关的资料,发现真正的元凶是SIGHUP信号导致的. 在linux中,有下面几个概念: 进程组: 一个或多个进程的集合,每一个进程组都有唯一一个进程组ID,即进程组会话器: 一个或多个

解决Linux关闭SSH,终端后运行程序终止问题(包括后台)

问题描述: 每次SSH到服务器上,然后运行了一个自己写的服务端程序,比如 ./myserver.sh ,然后关闭ssh或者终端之后,发现服务不能访问. 简要分析下: 根据   这篇博文  的提示,ssh登录后会新建一个会话,一个登陆shell发起的会话,一般由一个会话首进程.一个前台进程组.一个后台进程组组成.通常来说,会话首进程是一个登录shell,比如bash.进程组是一个或多个进程的集合,进程组属于一个会话.一般来说,一个进程组中的其它进程的父进程是进程组组长进程的ID,如果,这个进程组组

CentOS 不间断会话(ssh关闭后如何保证程序继续运行)(nohup和screen)

当使用ssh与远程主机的会话被关闭时,在远程主机上运行的命令也随之被中断. 就是ssh 打开以后,bash等都是他的子程序,一旦ssh关闭,系统将所有相关进程杀掉!! 导致一旦ssh关闭,执行中的任务就取消了. 守护进程不受此影响, 因为守护进程比较特殊, 不属于sshd这个进程组 而是单独的进程组,所以就算关闭了ssh,和他也没有任何关系. 解决办法: 1.使用nohup命令来运行程序 [[email protected] ~]$ nohup /opt/elasticsearch-6.5.1/

screen & tmux 技巧:linux后台运行程序

通俗简介: screen 简单应用: screen myprogram // 通过screen启动一个程序, 或者screen -L myprogram: turns on logging to ~/screenlog.0 ctr+a 然后再按一下 d // 使程序在后台运行,即detach screen -ls // 列出在screen后台运行的程序,以及ID(例如4491.pts-2.localhost) screen -r ID // 恢复运行程序到terminal,例如:screen -

screen实现关闭ssh之后继续运行代码

本文基于Ubuntu 14.04 使用SSH连接远程服务器,启动服务,退出SSH后,服务也就终止了,使用Screen可以解决这个问题. 1.安装Screen apt-get install screen 2.安装完成后,输入screen命令,根据提示按空格进入新的界面 3.像之前启动Meteor项目一样,进入目录,启动Meteor项目 cd /home/meteor/hello meteor 4.启动完成后访问项目 http://ip:3000,成功.关闭ssh窗口,继续访问,仍然成功. 5.再

五、清理mac缓存和关闭后台运行程序

一.清理mac 缓存  1.用鼠标点击桌面,然后按快捷键Command+Shift+G前往文件夹 2.输入路径:~/Library/Caches/ 3.清除所有的数据,把所有的Caches文件夹得都行都删除 二.关闭后台运行程序 1.打开Launchpad中的活动监视器 2.双击可以退出,正在运行的程序