0

0

如何在Linux中进程冻结 Linux cgroup freezer使用

P粉602998670

P粉602998670

发布时间:2025-09-11 10:31:01

|

441人浏览过

|

来源于php中文网

原创

Linux中使用cgroup freezer可精细冻结进程,需先挂载freezer子系统,创建cgroup目录,将进程PID写入tasks文件,再通过写FROZEN到freezer.state实现冻结,THAWED恢复,操作需root权限,注意v1与v2版本路径及控制方式差异。

如何在linux中进程冻结 linux cgroup freezer使用

Linux中要冻结进程,我们通常会利用cgroup的freezer子系统。这个机制允许你将一个或一组进程暂停(freeze)或恢复(unfreeze),就像给它们打了个“暂停键”。这在需要对某个服务进行维护、调试,或者在某些特殊场景下需要暂时隔离资源时,简直是神器。它不像

kill -STOP
那样粗暴,而是通过内核更深层的机制来管理,对进程状态的控制更为精细。

解决方案

要使用cgroup freezer,基本流程是这样的:

  1. 挂载cgroup文件系统:如果你的系统还没有挂载cgroup文件系统,或者freezer子系统没有挂载,你需要先做这一步。通常,现代Linux发行版已经默认挂载了。

    # 检查freezer是否已挂载
    mount -t cgroup | grep freezer
    # 如果没有,手动挂载(通常不需要,系统会自动处理)
    # sudo mkdir /sys/fs/cgroup/freezer
    # sudo mount -t cgroup -o freezer freezer /sys/fs/cgroup/freezer

    我一般会直接去

    /sys/fs/cgroup/freezer
    看看,如果目录存在且里面有文件,那多半是没问题的。

  2. 创建新的cgroup目录:在freezer子系统下创建一个新的目录,这代表一个独立的cgroup。

    sudo mkdir /sys/fs/cgroup/freezer/my_frozen_group

    给它起个有意义的名字,这样以后管理起来方便。

  3. 将进程添加到cgroup:把你想冻结的进程的PID写入到这个cgroup的

    tasks
    文件中。 假设我们有一个简单的测试进程,比如一个无限循环的bash脚本:

    # 在一个终端运行
    while true; do echo "Running..."; sleep 1; done &
    # 获取其PID
    PID=$!
    echo "Test process PID: $PID"

    然后将它加入cgroup:

    sudo sh -c "echo $PID > /sys/fs/cgroup/freezer/my_frozen_group/tasks"

    这里要注意权限问题,直接

    echo $PID > file
    可能会因为权限失败,所以用
    sudo sh -c "..."
    是个好办法。

  4. 冻结进程:通过修改

    freezer.state
    文件来控制进程状态。

    sudo sh -c "echo FROZEN > /sys/fs/cgroup/freezer/my_frozen_group/freezer.state"

    执行完这步,你会发现上面那个

    while true
    的脚本不再输出“Running...”,它被暂停了。

  5. 恢复进程:当需要恢复时,将状态改回

    THAWED

    sudo sh -c "echo THAWED > /sys/fs/cgroup/freezer/my_frozen_group/freezer.state"

    进程会立即恢复执行。

  6. 清理cgroup:当你不再需要这个cgroup时,需要先确保里面没有进程,然后才能删除它。

    # 将进程从cgroup中移除(通常在进程结束后或移到根cgroup)
    # 如果进程还在运行,可以把它移回根cgroup:
    # sudo sh -c "echo $PID > /sys/fs/cgroup/freezer/tasks"
    # 或者直接kill掉进程
    # kill $PID
    # 确认tasks文件为空
    cat /sys/fs/cgroup/freezer/my_frozen_group/tasks
    # 删除cgroup目录
    sudo rmdir /sys/fs/cgroup/freezer/my_frozen_group

    清理工作很重要,不然会留下一些无用的目录。

    XFUN
    XFUN

    小方智能包装设计平台

    下载

cgroup freezer的工作原理是什么?

cgroup freezer的核心机制在于它利用了Linux内核的进程调度器和信号处理机制。当一个进程被标记为

FROZEN
状态时,内核会确保这个进程不会被调度执行。它并不是简单地发送一个
SIGSTOP
信号给进程,因为
SIGSTOP
是由用户空间处理的,进程可以捕获并忽略它(虽然不太常见)。Freezer是直接在内核层面操作的,它将cgroup中的所有进程置于一个特殊的
TASK_STOPPED
状态,但这个
TASK_STOPPED
状态与用户通过
kill -STOP
看到的
T
状态有所不同。

具体来说,当freezer子系统收到

FROZEN
指令时,它会遍历该cgroup下的所有进程,并修改它们的内部状态标志。这些进程会进入一个不可运行的状态,不再参与CPU调度。它们不会消耗CPU时间,也不会响应外部信号(除了
SIGKILL
SIGCONT
,后者用于恢复)。它们占用的内存和打开的文件句柄依然存在,但其执行流被完全暂停。

这种内核层面的控制,使得freezer比传统的

SIGSTOP
/
SIGCONT
更为强大和可靠。它能够冻结那些可能忽略信号的进程,或者那些需要更细粒度控制的场景。在我看来,这就像是给整个进程组打了一个“时空凝固”的魔法,它们的所有动作都停止了,直到你解除魔法。

在使用cgroup freezer时可能遇到哪些常见问题或陷阱?

使用cgroup freezer虽然强大,但也并非没有坑。我个人就遇到过一些情况,分享一下:

  1. 权限问题:这是最常见的。操作

    /sys/fs/cgroup
    下的文件需要root权限。如果你不是root用户,或者没有正确使用
    sudo
    ,你会遇到
    Permission denied
    错误。我经常忘记
    echo "..." > file
    需要
    sudo sh -c "..."
    ,而不是简单的
    sudo echo "..." > file

  2. 进程无法冻结:有些非常底层的内核线程(kernel threads)可能无法被完全冻结,或者行为不符合预期。不过,对于我们日常的用户空间应用,这通常不是问题。如果遇到某个进程怎么也冻结不了,首先检查它是否是内核线程,其次确认它是否真的在你的cgroup里。

  3. 误操作导致系统不稳定:如果你不小心把关键系统进程(比如

    systemd
    的某些子进程)放入一个cgroup并冻结,可能会导致系统部分功能停止响应,甚至整个系统变得不稳定。所以,在生产环境中使用时,一定要谨慎,只针对明确需要控制的应用进程。我一般会先在测试环境充分验证。

  4. cgroup v1与v2的差异:如果你在不同的Linux发行版或内核版本之间切换,可能会遇到cgroup v1和v2的差异。v2的设计更加统一和简洁,但命令和文件路径可能有所不同。这就像你习惯了旧版软件的界面,突然换了新版,需要重新适应。

  5. 清理不彻底:前面提到过,如果cgroup目录里还有进程,你无法直接删除它。有时进程可能因为某种原因僵死,或者你忘记将它们移出,导致cgroup目录无法删除,需要手动清理或重启。

  6. 死锁或资源占用:虽然进程被冻结了,但它占用的内存、打开的文件句柄、网络连接等资源仍然存在。如果冻结了大量进程,或者冻结了一个持有重要锁的进程,可能会导致其他进程因为等待这些资源而阻塞,甚至引发死锁。这一点在进行系统维护时尤其需要注意。

cgroup v1和v2的freezer子系统有何区别

cgroup v1和v2是Linux控制组的两个主要版本,它们在架构和使用方式上存在显著差异,freezer子系统也不例外。理解这些差异对于在不同系统上正确使用cgroup至关重要。

cgroup v1 (Legacy): 在cgroup v1中,每个子系统(如

cpu
memory
freezer
等)都有自己独立的层级结构。这意味着你可以为
freezer
创建一个层级,为
cpu
创建另一个层级,它们之间是相互独立的。

  • 挂载点:通常每个子系统都有自己的挂载点,例如
    /sys/fs/cgroup/freezer
  • 文件结构:在
    freezer
    子系统下,你创建的每个cgroup目录中会有
    tasks
    cgroup.procs
    freezer.state
    等文件。
  • 状态控制:通过修改
    freezer.state
    文件(
    FROZEN
    THAWED
    )来控制进程状态。
  • 进程管理:进程可以同时属于不同子系统的cgroup,只要这些cgroup在各自的层级结构中。这有时会导致管理上的复杂性,因为一个进程可能同时受到多个独立子系统的控制。

cgroup v2 (Unified Hierarchy): cgroup v2引入了统一的层级结构,所有的子系统都挂载在同一个根目录下(通常是

/sys/fs/cgroup
)。这种设计旨在简化管理,并提供更清晰的资源控制模型。

  • 挂载点:只有一个统一的挂载点,通常是
    /sys/fs/cgroup
  • 控制器文件:v2中没有单独的
    freezer
    子系统目录。freezer功能现在是一个“控制器”(controller),它通过cgroup目录中的
    cgroup.freeze
    文件来控制。
  • 状态控制:将
    1
    写入
    cgroup.freeze
    表示冻结,将
    0
    写入表示解冻。
    # 假设你的cgroup v2根目录是 /sys/fs/cgroup
    # 创建cgroup
    sudo mkdir /sys/fs/cgroup/my_frozen_group_v2
    # 启用freezer控制器
    sudo sh -c "echo '+freezer' > /sys/fs/cgroup/my_frozen_group_v2/cgroup.subtree_control"
    # 添加进程
    sudo sh -c "echo $PID > /sys/fs/cgroup/my_frozen_group_v2/cgroup.procs"
    # 冻结
    sudo sh -c "echo 1 > /sys/fs/cgroup/my_frozen_group_v2/cgroup.freeze"
    # 解冻
    sudo sh -c "echo 0 > /sys/fs/cgroup/my_frozen_group_v2/cgroup.freeze"
  • 进程管理:在v2中,一个进程只能属于一个cgroup。所有的控制器都作用于这个cgroup。这种“单一归属”的设计使得资源管理更加直观,避免了v1中可能出现的混乱。

在我看来,cgroup v2的设计更加优雅和一致,它解决了v1中一些固有的复杂性。但由于历史原因,很多系统仍然在使用v1,或者同时支持v1和v2(混合模式)。因此,在实际操作时,你需要先确定你的系统是哪种模式,或者默认使用哪种版本,才能选择正确的命令和路径。可以通过

mount -t cgroup2
来检查是否挂载了cgroup v2。如果你的系统是较新的发行版,比如Ubuntu 20.04+、CentOS 8+,很可能已经默认使用或支持v2了。

相关专题

更多
while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

91

2023.09.25

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1352

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

704

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

294

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

776

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

573

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.07.20

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

0

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.6万人学习

Git 教程
Git 教程

共21课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号