Linux 服务器上,后台运行程序、使用 SSH 终端(比如 putty,xshell)连接服务器上运行比较耗时任务,可能需要几个小时甚至几天才能完成,这时候终端被占据,如果遇到网络不稳定,连接还会断开,程序也会中断。再说我们还要做其他的任务呢,这个时候,我们终端关闭 ->SSH 断开 -> 任务随即停止运行。这个是因为,我们退出 SSH 连接时,发送 SIGHUP 信号给控制会话,进而导致我们前台会话上的程序停止运行。所以需要将这一类耗时任务放到后台来跑,只需要记录好日志就行了,下面这些常用方法来实现这个需求。
&
当在前台执行某个作业时,终端被该作业占领;能够在命令后面加上 & 实现后台执行。比如:sh test.sh &
适合在后台执行的命令有 find、费时的排序及一些 shell 脚本。在后台执行作业时要当心:须要用户交互的命令不要放在后台执行,由于这样你的机器就会在那里傻等。只是,作业在后台执行一样会将结果输出到屏幕上。干扰你的工作。
假设放在后台执行的作业会产生大量的输出。最好使用以下的方法把它的输出重定向到某个文件里:
command > out.file 2>&1 &
这样,全部的标准输出和错误输出都将被重定向到一个叫做 out.file 的文件里。
注意:当你成功地提交进程以后,就会显示出一个进程号,能够用它来监控该进程,或杀死它。(ps -ef | grep 进程号 或者 kill -9 进程号)
nohup
nohup 是 no hang up 的缩写,指不间断,不挂断,在后台不挂断地运行命令。在关闭终端 / 退出账户后,nohup 在后台继续运行。默认情况下,nohup 的输出会保存到当前目录下的 nohup.out 文件中。
使用 nohup & 运行:
root@panel:~# nohup wget https://speed.hetzner.de/1GB.bin &
# 运行成功会输出一个 PID 号
[1] 169197
# 查找对应的 PID
root@panel:~# ps -aux | grep wget
root 169197 22.4 0.8 9712 6404 ? S 12:07 0:10 wget https://speed.hetzner.de/1GB.bin
root 169226 0.0 0.0 3312 712 pts/0 S+ 12:07 0:00 grep --color=auto wget
# 手动杀死对应的进程
kill -9 169197
Ctrl + z
可以将一个正在前台执行的命令放到后台,并且处于暂停状态。
Ctrl+c
终止前台命令。
jobs
查看当前有多少在后台运行的命令。
jobs - l 选项可显示所有任务的 PID,jobs 的状态可以是 running, stopped, Terminated。但是如果任务被终止了(kill),shell 从当前的 shell 环境已知的列表中删除任务的进程标识。
bg
将一个在后台暂停的命令,变成在后台继续执行。如果后台中有多个命令,可以用 bg %jobnumber
(jobnumber 是命令编号,不是进程号)将选中的命令调出。
fg
将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用 fg %jobnumber
(jobnumber 是命令编号,不是进程号)将选中的命令调出。
nohup 和 & 的区别
使用 & 命令后,作业被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会停止运行。
nohup 命令可以在你退出帐户之后继续运行相应的进程,并没有后台运行的功能,即若只使用 nohup,终端不再能够接收任何标准输入。
nohup 就是不挂起的意思(no hang up)。该命令的一般形式为:nohup command &
,最后一个 & 符号代表后台运行。
screen
screen 可以创建会话,在会话窗口中运行命令。挂起会话后,会话窗口中的命令在后台继续运行。在关闭终端 / 退出账户后,会话窗口中的命令不受影响。
执行 screen,如果提示 screen: command not found
命令不存在可以执行:yum install screen
或 apt-get install screen
安装。
常用 screen 命令:
screen -S name # 创建一个窗口
screen -ls # 查看当前已经创建的窗口
screen -d -r name # 回到名字为 name 的窗口
screen -X -S name quit # 关闭名字为 name 的窗口
用法:
screen [选项] [会话名]
选项:
选项 | 意义 |
---|---|
-4 | 仅将主机名解析为 IPv4 地址 |
-6 | 仅将主机名解析为 IPv6 地址 |
-a | 强制所有功能进入每个窗口的终端 |
-A | 将所有的视窗都调整为目前终端机的大小 |
-c file | 读取配置文件而不是 .screenrc |
-d (-r) | 挂起正在运行的会话(并在此处恢复) |
-dmS name | 启动作为守护程序:挂起会话 |
-D (-r) | 挂起和注销远程(并在此处恢复) |
-D -RR | 做任何需要的事情来获得一个会话 |
-e xy | 更改命令字符 |
-f | 流量控制开启 -fn = off ;-fa = auto |
-h lines | 设置回滚历史记录缓冲区的大小 |
-i | 当流量控制打开时,会更快地中断输出 |
-l | 登录模式开启 (update /var/run/utmp),-ln = off |
-ls [match] or -list | 列出所有的会话 |
-L | 打开输出日志记录 |
-Logfile file | 设置日志文件名 |
-m | 忽略已经运行的会话,强制创建一个新的会话 |
-O | 选择最佳输出而不是 exact vt100 emulation |
-p window | 如果已命名的窗口存在,则预选该窗口 |
-q | 安静的启动。如果不成功,则使用非零返回代码退出 |
-Q | 命令将向查询过程的 STDOUT 发送响应 |
-r [session] | 恢复已挂起的会话 |
-R | 尽可能地恢复一个会话,如果无法恢复,则创建一个新的会话 |
-s shell | 指定建立新会话时,所要执行的 shell |
-S sockname | 指定会话名 |
-t title | 设置标题(窗口名称) |
-T term | 对窗口使用 $term,而不是 screen |
-U | 使用 UTF-8 编码 |
-v | 显示版本信息 |
-wipe [match] | 清理无法使用的会话 |
-x | 恢复之前挂起的会话 |
-X | 在指定的会话中,以命令的形式执行 |
tmux
Tmux 是一个优秀的终端复用软件,类似 GNU Screen,但来自于 OpenBSD,采用 BSD 授权。使用它最直观的好处就是,通过一个终端登录远程主机并运行 tmux 后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机;是 BSD 实现的 Screen 替代品,相对于 Screen,它更加先进:支持屏幕切分,而且具备丰富的命令行参数,使其可以灵活、动态的进行各种布局和操作。
Tmux 安装
ubuntu 版本下直接 apt-get 安装:
sudo apt-get install tmux
centos7 版本下直接 yum 安装:
yum install -y tmux
tmux 终端下常用命令:
tmux new -s name # 新建名为 name 的会话
tmux ls # 列出所有会话列表
tmux a -t name # 从终端进入名为 name 的会话
tmux kill-session -t name # 销毁名为 name 的会话
tmux rename -t old_name new_name # 重命名会话
tmux 会话下常用命令
所有命令都需要先按Ctrl+b,激活控制台
命令 | 作用 |
---|---|
ctrl+b ? | 显示所有可用的命令,按 q 返回 |
ctrl+b c | 创建新的窗口,并切换到该窗口 |
ctrl+b w | 显示所有窗口列表 |
ctrl+b p | 切换到上一个窗口 |
ctrl+b n | 切换到下一个窗口 |
ctrl+b , | 重命名当前窗口 |
ctrl+b & | 关闭当前窗口 |
ctrl+b 数字键 | 切换到指定窗口 |
ctrl+b d | 暂时断开会话(使用该命令将程序后台运行,关掉终端程序不会停止) |
ctrl+b ~ | 列出提示信息缓存;其中包含了之前 tmux 返回的各种提示信息 |
ctrl+b : | 进入命令行模式;此时可以输入支持的命令,例如 kill-server 可以关闭服务器 |
tmux 窗格
tmux 的一个窗口可以被分成多个 pane(窗格),可以做出分屏效果。
命令 | 作用 |
---|---|
ctrl+b % | 将当前面板平分为左右两块 |
ctrl+b“ | 将当前面板平分为上下两块 |
ctrl+b o | 切换到下一个窗格 |
ctrl+b up / down / left / right | 切换窗格 |
ctrl+b space | 对当前窗口下的所有 pane 重新排列布局,每按一次,换一种样式 |
ctrl+b z | 最大化当前 pane,再按一次后恢复 |
ctrl+b x | 关闭当前使用中的 pane,操作之后会给出是否关闭的提示,按 y 确认即关闭 |
tmux 会话下查看历史输出
按 Ctrl-b,就会进入 copy mode,然后用 PgUp/PgDn 来浏览历史输出,按 q 退出。