进程

进程就是正在运行的程序。

当你启动一个程序,操作系统会先从硬盘中读取程序文件,然后将程序内容加载入内存中,最后 CPU 执行程序。这就是进程。

进程的基本概念


查看进程

htop

ps (process status)

ps 仅显示本终端中运行的相关进程。

ps aux 显示所有进程。

进程标识符 PID (process identifier)

PID是一个数字,是进程的唯一标识。

挂起、继续或终止进程时可以使用 PID 作为索引。

进程优先级

NI (nice)

取值范围-20~19,通常当前运行的程序NI值为0。NI越高,优先级越低。

指定优先级:

1
2
$ nice -n 10 vim # 以 10 为 nice 值运行 vim
$ renice -n 10 -p 12345 # 设置 PID 为 12345 的进程的 nice 值为 10

调低 nice 值需要?sudo

PRI (priority)

通常PRI = nice + 20。若PRI值是 RT,或者是负数,表明对应的进程有更高的实时性要求(例如内核进程、音频相关进程等)。

进程状态

粗略分:

  • 运行态(running)
  • 就绪态(ready)
  • 阻塞态(blocked)

详细分:

状态 缩写表示 说明
Running R 正在运行/可以立刻运行
Sleeping S 可以被中断的睡眠
Disk Sleep D 不可被中断的睡眠
Traced / Stopped T 被跟踪/被挂起的进程
Zombie Z 僵尸进程

进程控制


信号

信号是 Unix 系列系统中进程之间相互通信的一种机制。

发送信号的 Linux 命令叫作?kill

使用?man 7 signal?查看信号列表。

前后台切换

默认在 shell 中运行的命令都在前台运行。如果需要在后台运行,需要在命令最后加上?&

如果需要将前台程序切换到后台,则需要按下 Ctrl + Z 发送 SIGTSTP 使进程挂起,控制权还给 shell。

1
$ bg %2 # 将2号进程放入后台

终止进程

标准的终止进程信号是 SIGTERM,意味着一个进程的自然死亡。

在 htop 中发送信号

按 K 键,在左侧提示栏中选择需要的信号,按回车发送。

kill

1
2
$ kill -l # 显示所有信号名称
$ kill -9 PID # 9代表SIGKILL,立即结束进程PID

若不加任何参数,只有 PID,kill 将自动使用 15 (SIGTERM) 作为信号参数。

类kill命令

1
$ apropos kill # 显示各种其他的类kill命令

脱离终端

nohup

终端一旦被关闭,会向其中每个进程发送 SIGHUP (Signal hangup),而 SIGHUP 的默认动作是退出程序运行。在需要屏蔽 SIGHUP 的程序前添加 nohup,则运行时的输出将被重定向到 nohup.out(也可以自定义)。

tmux

tmux 是一个分屏的、运行在命令行的模拟终端。它可以将多个交互进程集成在在一个窗口上,并且不因断开连接或者暂时登出而消失,而是保存在后台,下一次登录时可以立即还原。

tmux 分为三部分:

  • 会话 (session):用于区分不同的工作;
  • 窗口 (window):会话中以显示屏为单位的不同的页;
  • 面板 (pane):窗口上被白线分割的不同区域。

安装和打开tmux:

1
2
$ sudo apt install tmux
$ tmux
快捷键(先 Ctrl + B) 功能
% 左右分屏
上下分屏
↑ ↓ ← → 焦点切换为上、下、左、右侧 pane,正在交互的 pane 被绿色框选中。
d (detach) 从 tmux 中脱离,回到命令行界面
z (zoom) 将 pane 暂时全屏,再按一次恢复原状
c 新建窗口
, 为窗口命名
s 列出所有 session

如果掉线,再次登录时使用?tmux attach [-t 窗口名称] 重新连接窗口,不加?-t 则默认连接最后一次打开的窗口。

定制tmux

服务


守护进程

只有启动时脱离会话才能避免因为终端的关闭而消失。这类一直默默工作于后台的进程被称为守护进程?(daemon)。

服务管理

绝大多数 Linux 发行版的 init 方案是 systemd,其管理系统服务的命令是?systemctl

使用 systemctl status?命令查看系统中正在运行的服务的情况。使用 systemctl list-units 查看所有 systemd 管理的服务的情况。

使用 tldr 查看服务的启动、终止、重载配置等命令。

自定义服务

编写 .service 配置文件并运行。

例行性任务

指实现周期性的定时任务。在 Linux 中主要有 atcrontab

at

at负责单次计划任务。

安装:

1
$ sudo apt install at

使用 tldr 查看使用方法。

crontab

crontab负责周期性的任务。

at 不同的是,crontab 大多通过配置文件实现。

查看 crontab 的用法:

1
$ crontab --help

配置格式:每一行前半段为时间,后半段为 shell 执行命令。

1
2
3
4
5
6
# 分   时   日   月   星期  | 命令
# 示例
* * * * * echo "hello" >> ~/count
# 每分钟输出 hello 到家目录下 count 文件
0,15,30,45 0-6 * JAN SUN command
# 每年一月份的每个星期日半夜 0 点到早晨 6 点每 15 分钟随便做点什么

crontab.guru网站可以将配置文件中的时间字段翻译为通俗易懂的表示。

附录


参考教程

Linux 101 - chap 04: 进程、前后台、服务与例行性任务

推荐阅读

进程和线程 - 廖雪峰的官方网站

进程、线程基础知识 - 小林coding

进程的概念 & 组成 & 特征

2023年3月 用 Allegro PCB Editor 制作封装

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×