Linux基础使用4-后台运行应用程序

后台运行应用程序指的是退出当前terminal以后,程序仍然在运行而不会随着terminal关闭而终止。

后台执行脚本命令功能介绍

&:将当前命令以后台的形式运行;
ctrl+z:将前台任务转后台并冻结;
bg:将后台冻结的任务再次运行起来;
fg:将后台任务重新转前台执行;
nohup:隔离终端挂断信号,是命令的前缀;
disown:隔离终端挂断信号,事后使用;
setsid:重新创建一个会话进程来执行任务;
(cmd):创建一个独立shell来执行命令;
jobs:查看在后台运行的任务列表;
ps:查看正在运行的进程信息;
kill:杀掉某个进程;

后台运行应用程序步骤

创建脚本

#创建脚本文件
sudo gedit hzqtest8.sh
#输入脚本内容
#!/bin/bash
for ((i = 0; i < 10; i++)); do
sleep 2
echo $(date)
done
#保存退出。

为脚本文件赋予执行权限

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

  1. 先运行程序

    ./hzqtest8.sh
  2. ctrl+z将当前的前台任务转后台,将任务放到后台任务池中,这个时候前台窗口就变成非阻塞状态,但是要注意转过去的任务在后台默认是冻结状态

  3. jobs查看所有任务状态ID

    jobs
  4. bg ID将后台冻结的任务再次运行起来

    比如说前面jobs查询到的任务ID为4,则输入:

    bg 4

disown、jobs和&

上面的例子中没有使用nohup命令,所以当终端环境强行退出时,后台正在执行的任务(作业/命令/程序/脚本)也会退出,由于各种原因可能想事后加上nohup的功能(忽略终端关闭信号)可以用下面的方法:

./hzqtest8.sh >hzqout.txt 2>&1 &
disown -h %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),是会话与窗口的"解绑"工具,将它们彻底分离。

有以下特点:

  1. 它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。
  2. 它可以让新窗口"接入"已经存在的会话。
  3. 它允许每个会话有多个连接窗口,因此可以多人实时共享会话。
  4. 它还支持窗口任意的垂直和水平拆分。

基本用法

安装
# Ubuntu 或 Debian
$ sudo apt-get install tmux

# CentOS 或 Fedora
$ sudo yum install tmux

# Mac
$ brew install tmux
启动与退出

启动 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
# or
tmux list-session
接入会话

使用会话编号切换

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:分离当前会话。
Ctrl+b s:列出所有会话。
Ctrl+b $:重命名当前会话。

基本操作流程

  1. 新建会话tmux new -s my_session
  2. 在 Tmux 窗口运行所需的程序。
  3. 按下快捷键Ctrl+b d将会话分离。
  4. 下次使用时,重新连接到会话tmux attach-session -t my_session

窗格操作

Tmux 可以将窗口分成多个窗格(pane),每个窗格运行不同的命令。

划分窗格

tmux split-window命令用来划分窗格。

# 划分上下两个窗格
tmux split-window

# 划分左右两个窗格
tmux split-window -h
移动光标

tmux select-pane命令用来移动光标位置。

# 光标切换到上方窗格
tmux select-pane -U

# 光标切换到下方窗格
tmux select-pane -D

# 光标切换到左边窗格
tmux select-pane -L

# 光标切换到右边窗格
tmux select-pane -R
交换窗格位置

tmux swap-pane命令用来交换窗格位置。

# 当前窗格上移
tmux swap-pane -U

# 当前窗格下移
tmux swap-pane -D
窗格快捷键
Ctrl+b %:划分左右两个窗格。
Ctrl+b ":划分上下两个窗格。
Ctrl+b <arrow key>:光标切换到其他窗格。`<arrow key>`是指向要切换到的窗格的方向键,比如切换到下方窗格,就按方向键`↓`。
Ctrl+b ;:光标切换到上一个窗格。
Ctrl+b o:光标切换到下一个窗格。
Ctrl+b {:当前窗格与上一个窗格交换位置。
Ctrl+b }:当前窗格与下一个窗格交换位置。
Ctrl+b Ctrl+o:所有窗格向前移动一个位置,第一个窗格变成最后一个窗格。
Ctrl+b Alt+o:所有窗格向后移动一个位置,最后一个窗格变成第一个窗格。
Ctrl+b x:关闭当前窗格。
Ctrl+b !:将当前窗格拆分为一个独立窗口。
Ctrl+b z:当前窗格全屏显示,再使用一次会变回原来大小。
Ctrl+b Ctrl+<arrow key>:按箭头方向调整窗格大小。
Ctrl+b q:显示窗格编号。

窗口管理

除了将一个窗口划分成多个窗格,Tmux 也允许新建多个窗口。

新建窗口

tmux new-window命令用来创建新窗口。

tmux new-window

# 新建一个指定名称的窗口
tmux new-window -n <window-name>
切换窗口

tmux select-window命令用来切换窗口。

# 切换到指定编号的窗口
tmux select-window -t <window-number>

# 切换到指定名称的窗口
tmux select-window -t <window-name>
重命名窗口

tmux rename-window命令用于为当前窗口起名(或重命名)。

tmux rename-window <new-name>
窗口快捷键
Ctrl+b c:创建一个新窗口,状态栏会显示多个窗口的信息。
Ctrl+b p:切换到上一个窗口(按照状态栏上的顺序)。
Ctrl+b n:切换到下一个窗口。
Ctrl+b <number>:切换到指定编号的窗口,其中的`<number>`是状态栏上的窗口编号。
Ctrl+b w:从列表中选择窗口。
Ctrl+b ,:窗口重命名。

其他命令

# 列出所有快捷键,及其对应的 Tmux 命令
tmux list-keys

# 列出所有 Tmux 命令及其参数
tmux list-commands

# 列出当前所有 Tmux 会话的信息
tmux info

# 重新加载当前的 Tmux 配置
tmux source-file ~/.tmux.conf

tee将数据重定向到文件

tee命令用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。

存在缓存机制,每1024个字节将输出一次。若从管道接收输入数据,应该是缓冲区满,才将数据转存到指定的文件中。若文件内容不到1024个字节,则接收完从标准输入设备读入的数据后,将刷新一次缓冲区,并转存数据到指定文件。

基本用法

语法

tee(选项)(参数) 

选项

-a:向文件中重定向时使用追加模式; 
-i:忽略中断(interrupt)信号。

参数

文件:指定输出重定向的文件。

在终端打印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
#Ctrl + z

关闭后台任务的命令

处于linux后台的任务有几种关闭方式:

  1. 任务运行完毕自行退出;
  2. 通过交互方式退出(包括传入参数对话,界面操作,终端ctrl+c等);
  3. 通过进程管理工具杀掉;
  4. 关闭系统退出等。

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的内容
import time
i=0
while i<1000:
time.sleep(1)
print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

利用 & 和 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'

参考资料

Tmux 使用教程

在linux后台运行脚本命令和程序的方法大全

Linux后台执行的方法 - 关闭、退出不影响

tee命令