Linux 命令在后台运行 & nohup screen tmux

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 screenapt-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退出。

退出移动版