linux下的后台进程管理
后台进程管理对于任何一个操作系统来说都是非常重要的,它们在维持操作系统的基本功能运作时,还能运行更多用户自定义的进程服务。
通过对后台进程管理的学习可以进一步了解操作系统的运作机制以及系统资源的分配调度。
本文主要介绍几种在linux系统下长时间运行后台进程的方法。即使断开ssh连接或者是关闭终端后,依然能够保持在后台运行。
nohup
概述
nohup命令是一个最简单的长时间运行后台进程的命令,通常它和
&符号一起使用。
nohup命令能够忽略SIGHUP信号的影响,在退出终端之后也能保持进程运行。(但是可以用Ctrl+C终止,即不忽略SIGINT信号)
&符号能够忽略SIGINT信号,并让命令和进程在后台运行,不在终端显示进程的输出信息,输出被重定向到指定的文件里,默认是nohup.out文件。(但是需要保持终端打开,退出终端后会终止)
将nohup和&结合使用就能可靠实现长时间在后台运行。
基本使用
运行
1 | nohup command > ./out.file 2>&1 & |
command是具体要在后台运行的命令。
out.file是指定的输出文件路径和文件名,如果缺省则默认输出到nohup.out文件中。
2>&1表示将标准错误2重定向到标准输出&1,标准输出&1再被重定向输入到输出文件中。
&表示在后台运行。
终止
nohup+&的进程可以通过ps命令搜索关键词得到进程号pid,再用kill命令终止。(一般来说,成功执行nohup后会输出pid的信息)
1 | ps -aux | grep [...] |
小结
nohup命令是linux自带的命令,它提供了最简单的长时间运行后台进程的方案,但是功能也相对较少,不足以应付一些复杂的交互性的任务,一般用于临时性地长时间运行某个命令。后面介绍的命令则提供了更多的功能。
screen
概述
screen命令(全称GNU Screen)用于多重视窗管理程序,可以在不同的终端连接到同一个会话,是一种终端多路复用器。screen的使用可以很方便地保留会话,并解决了nohup在交互性任务上的不足。
基本使用
安装
screen命令可能需要先手动安装
1 | # Debian/Ubuntu |
创建
创建一个名为test的虚拟终端(默认用hostname命名,推荐自定义名称)
1 | screen -S test |
或者使用
1 | screen -R test |
-R参数会先试图恢复已经存在的名为test的虚拟终端,如果找不到则创建新的虚拟终端。
使用-S参数可能会有重名的问题(pid不会重复),如下

水平分割
在screen窗口中,先输入Ctrl+a,再输入|,将当前窗口左右划分。
垂直分割
在screen窗口中,先输入Ctrl+a,再输入S,将当前窗口上下划分。
这里的
S必须大写
窗口切换
在screen窗口中,先输入Ctrl+a,再输入Tab,切换不同的窗口。
重连会话
重新进入虚拟终端,可以使用以下命令
1 | screen -r [name/pid] |
退出
在screen中,先输入Ctrl+a,再输入d会保留并退出该screen。
注意输入的顺序,否则会误删screen
查询
列出所有screen创建的虚拟终端以及其状态
1 | screen -ls |
或者在screen虚拟终端中,先输入Ctrl+a,再输入"即可查询。
虚拟终端具有两种状态
- Attached:激活状态,表示该
screen正在作为当前终端使用。 - Detached:非激活状态,表示该
screen正在作为后台进程运行。
终止
在进程处理完毕后,已经不需要虚拟终端了,就可以释放资源。
在对应的虚拟终端下时,可以用exit命令退出并释放资源。(推荐使用这种方式,因为能够直接确认当前终端是否处理完进程)
tips:在
screen中,输入Ctrl+d也可以释放该screen。
在主终端下,如果确定某个虚拟终端可以终止,也可以使用以下命令释放
1 | screen -R/-r/-S [name/pid] -X quit |
更多信息参考 雨月空间站
小结
screen虽然解决了nohup存在的局限性,但是功能相对后面的tmux还是稍微欠缺,不过基本能够满足大部分日常使用。用户可以根据自身的需求和习惯来选择GNU的screen或者是更加现代化的tmux。
tmux
概述
tmux是一个类似于screen的终端复用器,总体功能上比screen更加丰富,且风格更加现代化。
tmux具有会话(session)、窗口(window)、窗格(pane)的三层结构。会话是所有虚拟终端的集合,窗口是整个屏幕,窗格是各个虚拟终端。一个会话可以创建多个窗口,一个窗口可以创建多个窗格。
基本使用
安装
tmux的安装
1 | sudo apt install tmux |
创建会话
创建会话session
1 | tmux |
在tmux创建的会话底部会有一条状态栏,表示了当前的session name,session number,shell的类型以及hostname等。
创建一个名为test的会话session
1 | tmux new-session -s test |
会话管理:在tmux窗口中,先输入Ctrl+b,再输入s,可以查看并管理所有会话。
窗口分割
在一个tmux的会话中可以分割出多个窗格
水平分割
在tmux窗口中,先输入Ctrl+b,再输入%,将窗口左右划分。
垂直分割
在tmux窗口中,先输入Ctrl+b,再输入",将窗口上下划分。
多窗格管理
编号展示
在tmux窗口中,先输入Ctrl+b,再输入q,可以知道窗格创建的先后顺序。
窗格切换
在tmux窗口中,先输入Ctrl+b,再输入;,切换到上一个窗格;
先输入Ctrl+b,再输入o,切换到下一个窗格。
窗格关闭
在tmux窗口中,先输入Ctrl+b,再输入x,可以关闭当前选中的窗格。也可以使用Ctrl+d或者exit命令,直接退出窗格。
多窗口管理
创建窗口
在tmux窗口中,先输入Ctrl+b,再输入c,可以创建新的窗口,新窗口会覆盖当前窗口,同时底部状态栏会多出一个shell的信息。
切换窗口
在tmux窗口中,先输入Ctrl+b,再输入p,切换到上一个窗口;
先输入Ctrl+b,再输入n,切换到下一个窗口;
先输入Ctrl+b,再输入w,可以在列表中选择窗口。
更多快捷键参考Tmux的常用快捷键 | 知乎
查询会话
列出所有已创建的tmux
1 | tmux ls |
tips:也可以用前面提到的方法,在
tmux窗口中,先输入Ctrl+b,再输入s,也可以查询已创建的tmux
脱离会话
在tmux窗口中,先输入Ctrl+b,再输入d,或者使用以下命令
1 | tmux detach |
就能保存会话并脱离。
注意:如果输入的是
Ctrl+d,则会直接删除会话。
重连会话
1 | tmux attach -t [session-name] |
删除会话
在主终端下,执行以下命令
1 | tmux kill-session -t [session-name] |
或者在tmux窗口中,输入Ctrl+d,即可将会话删除。
小结
tmux拥有比screen更加友好的信息提示,交互体验更加好。tmux也基本满足了日常使用需求,是适合广大用户的选择。
不过,如果习惯了
screen的快捷键操作等,也可以使用screen,同样可以很好地满足需求,而不必在多个工具间切换。另外,不建议同时使用
screen和tmux管理后台进程,一方面,它们的操作方式不同,另一方面,它们在管理后台进程时可能会冲突。
关于tmux更多的技巧操作可以参考你需要知道的tmux使用技巧 | 知乎
以及对tmux的美化配置可以参考推荐神器Tmux和巨好看的配置文件 | 知乎
byobu
概述
byobu是基于screen和tmux的终端多路复用器包装器,它通常和screen或tmux组合使用,在screen或tmux的基础上提供更多的功能支持。它本身无法独立实现screen和tmux的功能。
byobu早期是为screen开发的前端包装器,默认使用screen作为后端,目的是降低配置和操作成本。现在的
byobu默认使用tmux后端,相当于tmux的增强版,习惯screen的用户也可以手动配置byobu使用screen后端。
基本使用
byobu可以直接套用其后端的命令格式,如果使用的是tmux后端,只需要在tmux命令的基础上把tmux换成byobu即可,screen同理。
实际上,使用
byobu的功能主要是通过各种快捷键。
安装
1 | sudo apt install byobu |
操作
byobu的命令可以直接套用其后端的命令,也可以直接使用其后端的快捷键操作。
以下是基于tmux后端的几个命令示例,直接套用tmux的命令格式即可
1 | # 创建会话 |
快捷键操作可参考byobu常用快捷键 | 知乎,里面是以
screen为后端的例子注意:
screen的前置快捷键是Ctrl+a,tmux的前置快捷键是Ctrl+b
补充
byobu的默认配置和tmux很相似,一开始看不出明显的区别,需要手动配置byobu。
Zellij
概述
Zellij是基于Rust实现的终端多路复用器,与WebAssembly原生兼容。Zellij的最大特点是支持插件,并且预先包装好了一个开箱即用的友好用户界面。它的用户窗口底部展示了一些键位以及其对应的功能类,能够帮助用户快速适应基本操作。另外对于tmux用户来说,Zellij兼容tmux的主要快捷键,因此tmux用户可以更快地适应Zellij。
基本使用
Zellij的下载方式可参考官网 https://zellij.dev/
Zellij的使用哲学是:先进入对应的功能类,然后使用提示的按键进行操作,最后按下enter键确认。这种方式使得Zellij的操作非常直观和易用。
Zellij的基本操作说明已经整合到了它那开箱即用的用户界面中,可以根据它的界面提示来进行操作。从笔者个人角度来看,Zellij可能是最容易学习的。
小结
Zellij的诞生揭示了几个重要的趋势和需求
跨平台兼容性:
Zellij使用Rust编写,可以在多种操作系统上运行,用户和开发者都可以在多个平台上无缝切换使用它。实际上,从跨平台的概念出现到现在,已经诞生了一大批跨平台的工具。
插件化和可定制性:
Zellij拥有插件系统,这是传统的终端复用器所不具备的。用户可以通过插件系统定制和扩展工具的功能或外观布局。(不过目前Zellij的插件生态仍在完善中)插件系统也是一种设计哲学,典型的例子就是
vscode和Neovim。易用性和直观性:
Zellij提供了预先配置的开箱即用的用户界面,使得新用户可以更容易地上手,且不需要过多的配置。这点在另一个
Rust工具——helix的设计理念中也有所体现。借助helix的内置文档和提示,初学者在面对helix或vim及其分支Neovim时,学习helix的成本远远低于vim系列的工具。性能和效率:
Zellij是由Rust实现的工具,而Rust语言本身就是为了提供高性能和内存安全。目前也涌现出了一大批由
Rust重写的工具,不过Rust总体生态还需要开发者和用户群体双方的支持和投入。
其他
这部分方案适用于有特定需求的开发者。网站开发者,游戏服务器开发者或者是深度学习开发者等大型项目开发者,screen和tmux不适合管理这些大项目,因为它们不具有因程序崩溃或意外终止而自动重启的功能及其他的一些高级功能。
systemd
systemd是大部分主流linux系统的默认初始化系统,它通过systemctl这个命令来控制,具有screen和tmux所不具备的高级功能。
但是systemd与系统耦合度较高,而且其自定义配置需要具备一定的专业知识,通常一般的用户很少使用systemd来作为首选方案。
这里指的是配置
systemd管理用户自定义的程序,不是指使用systemd,systemd在日常生活就已经很频繁地在使用了。
不过,有很多专业软件程序都有对systemd的支持,例如mysql、nginx、NetworkManager等,对于特定的linux系统开发者来说。
supervisor
supervisor是一个专注后台进程管理的程序,它使用supervisorctl命令来控制,可以让开发人员方便地管理和监控进程,它基于python开发,是开发者快速管理项目的一套简单易用的方案,不需要考虑过高的系统耦合性问题。
有一部分
linux发行版并不是使用systemd作为初始化系统(尽管大多数发行版都在支持systemd),这部分的系统就无法使用systemd的方案。因此,supervisor可能会是一种方案。
相关使用和配置可以参考Linux进程管理工具 Supervisor详解 | 知乎
参考资料
Linux终端命令神器–Screen命令详解 | 雨月空间站
- 标题: linux下的后台进程管理
- 作者: Entropy Tree
- 创建于 : 2023-04-20 20:41:30
- 更新于 : 2023-11-12 19:15:15
- 链接: https://www.entropy-tree.top/2023/04/20/managing-background-processes-in-linux/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。