实现关闭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

# Copy and paste like in vim 
unbind [
bind Escape copy-mode
unbind p
bind p paste-buffer
bind -t vi-copy 'v' begin-selection
bind -t vi-copy 'y' copy-selection

# Highlight active window
setw -g window-status-current-bg red 

# Open remind
setw -g monitor-activity on  
set -g visual-activity on
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页