Linux基础使用4-后台运行应用程序
Linux基础使用4-后台运行应用程序
后台运行应用程序指的是退出当前terminal以后,程序仍然在运行而不会随着terminal关闭而终止。
后台执行脚本命令功能介绍
&:将当前命令以后台的形式运行; |
后台运行应用程序步骤
创建脚本
#创建脚本文件 |
#输入脚本内容 |
为脚本文件赋予执行权限
sudo chmod 755 hzqtest8.sh |
后台运行应用程序常用方法
&配合ctrl+d或exit退出
./hzqtest8.sh & |
注意&前面有空格,这种方法中,当非正常退出当前shell终端时(包括直接叉掉、杀死、直接注销关机等),后台运行的hzqtest8.sh也会结束。这是因为脚本在后台运行时,运行脚本的父进程是当前shell终端进程,关闭当前shell终端时,会发送hangup挂断信号给子进程,子进程收到hangup信号后也就退出了。
但是,如果用exit退出,ctrl+d退出,命令可以继续在后台运行。
nohup和&
nohup ./hzqtest8.sh & |
功能:命令前加上nohup
可以在退出shell之后继续运行相应的进程。nohup
就是忽略当前任务挂断信号的意思。
nohup
默认会把标准输出重定向到默认文件nohup.out中,可以自定义该输出文件,如下:
nohup ./hzqtest8.sh >hzqout.txt & |
ctrl+z、jobs和bg
先运行程序
./hzqtest8.sh
ctrl+z
将当前的前台任务转后台,将任务放到后台任务池中,这个时候前台窗口就变成非阻塞状态,但是要注意转过去的任务在后台默认是冻结状态。jobs
查看所有任务状态IDjobs
bg
ID将后台冻结的任务再次运行起来比如说前面
jobs
查询到的任务ID为4,则输入:bg 4
disown、jobs和&
上面的例子中没有使用nohup命令,所以当终端环境强行退出时,后台正在执行的任务(作业/命令/程序/脚本)也会退出,由于各种原因可能想事后加上nohup的功能(忽略终端关闭信号)可以用下面的方法:
./hzqtest8.sh >hzqout.txt 2>&1 & |
功能:disown
也是隔离终端挂断信号,但主要用于事后使用。上面执行完disown
之后,可以强行关闭终端窗口,然后等待1分钟后去查看重定向文件hzqout.txt看看有没有执行成功,如果成功里面有完整的10条信息,并且是连续的。
setsid和&
setsid ./hzqtest8.sh & |
功能:setsid
是重新创建一个会话进程来执行任务。setsid可以起到和nohup类似的效果,但是setsid
更彻底,所以严格上说setsid
不是忽略终端关闭信号,而是这个后台任务创建之后就与当前终端没有关系了,所以当前终端的关闭自然不会影响到它,特别的,jobs
命令在这个时候是不起作用的。
另外,和nohup还有一个区别就是,不用多打一个回车,因为它没有提示信息。
小括号/圆括号 和&
(./hzqtest8.sh &) |
功能:小括号可以起到和setsid类似的效果,小括号是创建一个独立shell来执行命令,当前的后台任务创建之后就与当前终端没有关系了,所以终端的关闭也不会影响到它。
Tmux
以下内容摘自:Tmux 使用教程,主要是为了方便自查,如若侵权请联系我。
命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称"窗口"),在里面输入命令。用户与计算机的这种临时的交互,称为一次"会话"(session) 。
会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完。
一个典型的例子就是,SSH 登录远程计算机,打开一个远程窗口执行命令。这时,网络突然断线,再次登录的时候,是找不回上一次执行的命令的。因为上一次 SSH 会话已经终止了,里面的进程也随之消失了。
为了解决这个问题,会话与窗口可以"解绑":窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话"绑定"其他窗口。
Tmux 是一个终端复用器(terminal multiplexer),是会话与窗口的"解绑"工具,将它们彻底分离。
有以下特点:
- 它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。
- 它可以让新窗口"接入"已经存在的会话。
- 它允许每个会话有多个连接窗口,因此可以多人实时共享会话。
- 它还支持窗口任意的垂直和水平拆分。
基本用法
安装
# Ubuntu 或 Debian |
启动与退出
启动 Tmux 窗口,底部有一个状态栏。状态栏的左侧是窗口信息(编号和名称),右侧是系统信息。
tmux |
按下Ctrl+d
或者显式输入exit
命令,就可以退出 Tmux 窗口。
exit |
前缀键
Tmux 窗口有大量的快捷键。所有快捷键都要通过前缀键唤起。默认的前缀键是Ctrl+b
,即先按下Ctrl+b
,快捷键才会生效。
举例来说,帮助命令的快捷键是Ctrl+b ?
。它的用法是,在 Tmux 窗口中,先按下Ctrl+b
,再按下?
,就会显示帮助信息。
然后,按下 ESC
键或q
键,就可以退出帮助。
会话管理
新建会话
第一个启动的 Tmux 窗口,默认编号是0
,第二个窗口的编号是1
,以此类推。也可以新建一个指定名称的会话:
tmux new -s <session-name> |
分离会话
在 Tmux 窗口中,按下Ctrl+b d
或者输入tmux detach
命令,就会将当前会话与窗口分离。
tmux detach |
上面命令执行后,就会退出当前 Tmux 窗口,但是会话和里面的进程仍然在后台运行。
tmux ls
命令可以查看当前所有的 Tmux 会话。
tmux ls |
接入会话
使用会话编号切换
tmux attach -t 0 |
使用会话名称切换
tmux attach -t <session-name> |
杀死会话
使用会话编号切换
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> |
会话快捷键
Ctrl+b d:分离当前会话。 |
基本操作流程
- 新建会话
tmux new -s my_session
。 - 在 Tmux 窗口运行所需的程序。
- 按下快捷键
Ctrl+b d
将会话分离。 - 下次使用时,重新连接到会话
tmux attach-session -t my_session
。
窗格操作
Tmux 可以将窗口分成多个窗格(pane),每个窗格运行不同的命令。
划分窗格
tmux split-window
命令用来划分窗格。
# 划分上下两个窗格 |
移动光标
tmux select-pane
命令用来移动光标位置。
# 光标切换到上方窗格 |
交换窗格位置
tmux swap-pane
命令用来交换窗格位置。
# 当前窗格上移 |
窗格快捷键
Ctrl+b %:划分左右两个窗格。 |
窗口管理
除了将一个窗口划分成多个窗格,Tmux 也允许新建多个窗口。
新建窗口
tmux new-window
命令用来创建新窗口。
tmux new-window |
切换窗口
tmux select-window
命令用来切换窗口。
# 切换到指定编号的窗口 |
重命名窗口
tmux rename-window
命令用于为当前窗口起名(或重命名)。
tmux rename-window <new-name> |
窗口快捷键
Ctrl+b c:创建一个新窗口,状态栏会显示多个窗口的信息。 |
其他命令
# 列出所有快捷键,及其对应的 Tmux 命令 |
tee将数据重定向到文件
tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。
存在缓存机制,每1024个字节将输出一次。若从管道接收输入数据,应该是缓冲区满,才将数据转存到指定的文件中。若文件内容不到1024个字节,则接收完从标准输入设备读入的数据后,将刷新一次缓冲区,并转存数据到指定文件。
基本用法
语法
tee(选项)(参数) |
选项
-a:向文件中重定向时使用追加模式; |
参数
文件:指定输出重定向的文件。
在终端打印stdout同时重定向到文件。
练习
在终端打印stdout同时重定向到文件中:
ls | tee out.txt |
前后台任务的转换
fg:后台转前台
jobs
命令查看任务信息ID
jobs |
fg N
将选中的任务调到前台,跳到前台之后终端界面被阻塞,此时终端不能做别的事情
fg 1 |
bg:将后台冻结的任务再次运行起来,运行后任务还在后台
jobs
命令查看任务信息ID
jobs |
bg N
将后台冻结的任务再次运行起来,运行后任务还在后台
bg 1 |
Ctrl + z:前台转后台,并冻结运行状态
./hzqtest8.sh |
关闭后台任务的命令
处于linux后台的任务有几种关闭方式:
- 任务运行完毕自行退出;
- 通过交互方式退出(包括传入参数对话,界面操作,终端ctrl+c等);
- 通过进程管理工具杀掉;
- 关闭系统退出等。
Ctrl+c
如果任务还没有转到后台运行,那么直接Ctrl+c 就可以终止了。
前台转后台+Ctrl+c
将后台任务转到前台然后执行ctrl+c来终止。
kill:属于进程管理工具,可以杀掉进程
方法1:配合jobs
jobs
命令查看任务信息ID
jobs |
kill -9 %N
杀死进程
kill -9 %2 |
方法2:配合ps
先通过ps
命令查看任务PID
ps -ef |grep gedit |
然后通过PID
杀掉进程,注意使用管理员权限。
sudo kill -9 3791 |
练习
程序后台运行,进程管理
在/home/coggle目录下在你英文昵称(中间不要有空格哦)的文件夹中创建一个sleep.py文件,该文件需要完成以下功能: 1. 程序一直运行 2. 每10秒输出当前时间
vim sleep.py |
#sleep.py的内容 |
利用 & 和 nohup后台运行sleep.py,并将输出结果写入到tmp.txt文件
nohup sleep.py >tmp.txt 2>&1 |
利用tmux后台运行sleep.py,并将输出结果写入到tmp.txt文件
tmux new -d 'python3 sleep.py |& tee tmux.log' |