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 进行许可。