概述
使用场景:
- 用终端软件登录远程Linux服务器时,假设执行的shell命令耗时特别长,这时候因为各种因素导致掉线(网络不稳定)就会导致之前的执行前功尽弃,运行的命令进程会被系统kill,我们想要的结果也丢失了。
- 如果想让终端关闭和掉线的情况下,命令和相关进程也能在远程Linux主机上执行,我们需要以脱离终端的方式在后台运行这个shell命令。
主要有三种方法:
- 命令后加
&
- 作用:让命令在后台处于运行状态 。
- 缺点:退出终端就会退出执行。
- nohup:可以记录发生日志。
- tmux:可以保存上次的工作流 。
同时需要说明的是:
- 每个被放入后台的命令都会被分配一个
工作号
。第一个被放入后台的命令,工作号是 1;第二个被放入后台的命令,工作号是 2,以此类推。
命令后面加&
操作:在命令后面加入 空格 &
。
作用:使用这种方法放入后台的命令,在后台处于执行状态。
限制条件:放入后台执行的命令不能与前台有交互,否则这个命令是不能在后台执行的。
注意事项:在后台运行作业时要当心,需要用户交互的命令不要放在后台执行,因为这样机器就会一直等待。不过,作业在后台运行一样会将结果输出到屏幕上,干扰工作。
缺点:
- 不可以使之脱离终端运行,退出终端就会退出执行。
- 使用
&
被到后台执行的进程,它的父进程还是当前终端shell的进程。所以一旦父进程退出,则会发送hangup信号
给所有子进程,子进程收到hangup以后也会退出。
当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。有nohub和setsid两种方法:
- nohup 的用途就是让提交的命令忽略 hangup 信号。
- 可以用setsid将父进程设为init进程(进程号为1)。setsid的用途就是让进程运行在新的会话里从而成为不属于此终端的子进程(fork)。
[root@node2 ~]# echo $$ //显示 当前shell的进程号
22761
[root@node2 ~]# setsid test.sh & //设置父进程为init进程(进程号1)
[root@node2 ~]# ps -ef|grep test.sh //查询放入后台的进程
nohup
需要输入 exit 退出,会自动将输出写到当前目录下的 nohup.txt中。方法如下:
[root@node2 ~]# nohup test.sh &
[root@node2 ~]# exit //输入exit命令退出终端
说明
- nohup命令可以让你的shell命令忽略SIGHUP信号,即可以使之脱离终端运行;
- “&”可以让你的命令在后台运行。
tmux
Tmux (terminal multiplexer,终端复用器)是一种终端复用器,是会话与窗口的"解绑"工具,将它们彻底分离。
Tmux开源代码:https://github.com/tmux/tmux.git。可以在OpenBSD,FreeBSD,NetBSD,Linux,OS X,Solaris上运行。
安装:
# CentOS 或 Fedora
$ sudo yum install tmux
启动:
$ tmux
退出:
#按下Ctrl+d或者显式输入exit命令
$ exit
新建会话:
tmux new -s <session-name>
分离会话:
Ctrl+b d
或者输入tmux detach
命令,就会将当前会话与窗口分离。
$ tmux detach
查看所有会话:
$ tmux ls
# or
$ tmux list-session
接入会话
tmux attach命令用于重新接入某个已存在的会话。
# 使用会话编号
$ tmux attach -t 0
# 使用会话名称
$ tmux attach -t <session-name>
杀死会话:
tmux kill-session命令用于杀死某个会话。
# 使用会话编号
$ tmux kill-session -t 0
# 使用会话名称
$ tmux kill-session -t <session-name>
切换会话:
# 使用会话编号
$ tmux switch -t 0
# 使用会话名称
$ tmux switch -t <session-name>
重命名会话:
$ tmux rename-session -t 0 <new-name> #将0号会话重命名。
综上,这里给出示例流程:
新建会话tmux new -s my_session。
在 Tmux 窗口运行所需的程序。
按下快捷键Ctrl+b d将会话分离。
下次使用时,重新连接到会话tmux attach-session -t my_session。
窗格操作的快捷键:
Ctrl+b %:划分左右两个窗格。
Ctrl+b ":划分上下两个窗格。
Ctrl+b <arrow key>:光标切换到其他窗格。<arrow key>是指向要切换到的窗格的方向键,比如切换到下方窗格,就按方向键↓。
Ctrl+b x:关闭当前窗格。
Ctrl+z
作用:在命令执行过裎中按 Ctrl+Z 快捷键,命令在后台处于暂停状态。
注意:使用Ctrl+Z 放入后台的命令,就算不和前台有交互,能在后台执行,也处于暂停状态,因为 Ctrl+Z 快捷键就是暂停的快捷键。
[root@computer1~]# top
//在top命令执行的过程中,使用了Ctrl+Z后
[1]+ 已停止
//top命令被放入后台,工作号是1,状态是暂停。
[root@computer1~]# jobs //查看任务
[1]+ 已停止 top
[root@computer1~]# fg %1 //将后台任务调到前台
- [1] 是这个命令的工作号,"+"代表这个命令是最近一个被放入后台的。
相关任务管理命令
# ctrl+z //挂起当前任务
# ctrl+c //结束当前任务
# jobs //查看任务,返回任务编号n
# jobs -l //查看任务,返回任务编号n和进程号
# bg %n //将编号n的任务转为后台运行
# fg %n //将编号n的任务转为前台运行
相关概念
Session(会话)
:每打开一次终端(本地或远程)登录Linux,都会生成一个新的会话:
- 程序中也可以调用函数setsid创建一个新的会话;脚本也可以调用命令setsid创建一个新的会话。
- 新建的会话无控制终端。
- 会话的重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完。
参考资料
Linux命令放入后台运行方法(&和Ctrl+Z)详解版
nohup命令、setsid命令、Daemon(守护进程)简要梳理
Tmux 使用教程-阮一峰