1、前言
工作的时候使用终端操作,往往会因为网络、关闭屏幕、执行CTRL+C等等原因造成ssh断开,使得正在运行的程序退出。
2、原因
主要原因在于上述的相关操作,shell默认会发送中断信号给该终端session关联的进程,从而导致进程跟随终端退出
3、分析
了解两种中断信号:
1、sigint:signal interrupt,ctrl+c会发送此信号,主动关闭程序
2、sighup: signal hang up,关闭终端,网络断线,关闭屏幕会发送此挂断信号
4、解决方案
下面我们来介绍几种后台运行的方式:
5、& 符号
把 & 符号放在执行命令的最后,使启动的程序忽略sigint信号。此时执行ctrl+c就不会关闭此进程,但是如果屏幕关闭、断网的话仍然会造成进程退出。
5.1示例
sh test.sh &
6、nohup指令
nohup(no hang up),意思就是不挂断运行。
用nohup运行命令可以使命令永久执行下去,和用户终端没有关系,断开SSH也不影响运行。
nohup捕获了SIGHUP,并做了忽略处理,因此当屏幕关闭,断网等造成ssh中断时进程不会退出。但是ctrl+c可以关闭该进程。
因此大多数情况下我们同时使用nohup和&符号来启动程序,ctrl+c和关闭终端都无法关闭。在缺省情况下所有输出都被重定向到一个名为nohup.out的文件中,此文件可以指定。
6.1基本格式
nohup Command \[ Arg ... \] \[ & \]
6.2语法
nohup (选项) (参数)
选项:
--help:在线帮助
--version:显示版本信息
参数:
程序及选项:要运行的程序及选项
6.3实例
nohup test.sh > laifu.file 2>&1 &
相关数字含义:
0:stdin (standard input)
1:stdout (standard output)
所以,nohup command > laifu.log 等价于 nohup command 1> laifu.log,这是缺省行为
2:stderr (standard error)
在上例中,输出被重定向到laifu.file文件中
7、ctrl + z、jobs、fg、bg
如果我们程序在启动的时候并没有使用&,nohup怎么办呢?
难道我们需要先执行ctrl + c将前台执行的进程终止再重新启动吗?显然很不科学。
7.1 ctrl + z
将一个前台执行的作业进程放到后台并且暂停,用术语讲就是挂起。执行后如下:
[1]+ Stopped ./test.sh
7.2 jobs
查看当前有多少在后台运行的命令,[jobnumber] 就是作业号
jobs
[1]+ Stopped ./test.sh
[2]+ Running ./test2.sh &
[3]+ Running ./test3.sh &
[4]+ Running ./test4.sh &
[5]+ Running ./test5.sh &
[6]+ Running ./test6.sh &
7.3 bg
将后台中暂停(挂起)的作业进程继续运行,例如把1号作业(./test.sh) 后台运行
执行完注意看已经带了&
bg 1
[1]+ ./test.sh &
7.4 fg
将后台中的作业调至前台继续运行,例如把2号作业(./test2.sh &)调至前台运行
fg 2
./test2.sh
8、screen命令
8.1 介绍
8.1.1 官方介绍
Screen 是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
8.1.2 人话介绍
我们可以理解为screen是一个虚拟终端软件,相当于直接在linux系统里面启动了另外一个后台程序接管(维持)了你的终端会话,当你直接连接的终端ssh断开时他仍然让程序认为你的ssh持续链接着,这样也就不会出现进程接收到中断信号而退出的情况。
8.2安装
yum install screen -y
8.3使用
8.3.1 新建会话
新建一个叫laifu的session
screen -S laifu
8.3.2 列出当前所有的session
# screen -ls
There is a screen on:
28046.laifu (Attached)
1 Socket in /var/run/screen/S-root.
8.3.3 恢复会话
回到laifu这个session
screen -r laifu
8.3.4 detach某个session
# 远程detach某个session
screen -d laifu
# 结束当前session并回到laifu这个session
screen -d -r laifu
8.3.5 删除会话
# screen -XS "会话id或者名称" quit
screen -XS laifu quit
8.4 参数选项
-A 将所有的视窗都调整为目前终端机的大小。
-d <作业名称> 将指定的screen作业离线。
-h <行数> 指定视窗的缓冲区行数。
-m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称> 恢复离线的screen作业。
-R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s 指定建立新视窗时,所要执行的shell。
-S <作业名称> 指定screen作业的名称。
-v 显示版本信息。
-x 恢复之前离线的screen作业。
-ls或--list 显示目前所有的screen作业。
-wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。
8.5 常用screen参数
screen -S yourname -> 新建一个叫yourname的session
screen -ls -> 列出当前所有的session
screen -r yourname -> 回到yourname这个session
screen -d yourname -> 远程detach某个session
screen -d -r yourname -> 结束当前session并回到yourname这个session
8.6 补充
在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
C-a ? -> 显示所有键绑定信息
C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
C-a n -> Next,切换到下一个 window
C-a p -> Previous,切换到前一个 window
C-a 0..9 -> 切换到第 0..9 个 window
Ctrl+a [Space] -> 由视窗0循序切换到视窗9
C-a C-a -> 在两个最近使用的 window 间切换
C-a x -> 锁住当前的 window,需用用户密码解锁
C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
C-a w -> 显示所有窗口列表
C-a t -> time,显示当前时间,和系统的 load
C-a k -> kill window,强行关闭当前的 window
C-a -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 [vi 一样
C-b Backward,PageUp
C-f Forward,PageDown
H(大写) High,将光标移至左上角
L Low,将光标移至左下角
0 移到行首
$ 行末
w forward one word,以字为单位往前移
b backward one word,以字为单位往后移
Space 第一次按为标记区起点,第二次按为终点
Esc 结束 copy mode
C-a ] -> paste,把刚刚在 copy mode 选定的内容贴上