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

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,基本流程是这样的:

挂载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

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

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

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

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

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

tasks

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

# 在一个终端运行while true; do echo "Running..."; sleep 1; done &# 获取其PIDPID=$!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 "..."

是个好办法。

冻结进程:通过修改

freezer.state

文件来控制进程状态。

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

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

while true

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

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

THAWED

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

进程会立即恢复执行。

清理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

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

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虽然强大,但也并非没有坑。我个人就遇到过一些情况,分享一下:

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

/sys/fs/cgroup

下的文件需要root权限。如果你不是root用户,或者没有正确使用

sudo

,你会遇到

Permission denied

错误。我经常忘记

echo "..." > file

需要

sudo sh -c "..."

,而不是简单的

sudo echo "..." > file

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

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

systemd

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

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

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

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

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# 创建cgroupsudo 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了。

以上就是如何在Linux中进程冻结 Linux cgroup freezer使用的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/203364.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
曝华为任正非与奇瑞尹同跃在深圳会晤 9系旗舰要来了?
上一篇 2025年11月1日 22:29:36
vivo V30 Pro系统字体更换方法 vivo V30 Pro主题自定义技巧
下一篇 2025年11月1日 22:29:41

相关推荐

  • 如何查询用户可以使用的镜像资源

    本篇文章给大家带来的内容是关于如何查询用户可以使用的镜像资源,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 DescribeImages 描述 您可以查询的镜像资源包括您的自定义镜像、阿里云提供的公共镜像、云市场镜像以及其他阿里云用户主动共享给您的共享镜像。 支持分页查询,查询结果…

    2026年9月1日
    100
  • 大数据之脚踏实地学03–Linux的常用文件级命令

    大数据之脚踏实地学03–Linux的常用文件级命令大数据之脚踏实地学03–Linux的常用文件级命令大数据之脚踏实地学03–Linux的常用文件级命令大数据之脚踏实地学03–Linux的常用文件级命令

    前言 众所周知,大数据工具(如Hadoop、Storm、Hive、Spark等)都运行在Linux系统上。因此,了解并熟练操作Linux系统是学习大数据的基础步骤。Linux系统的操作与Windows系统的图形化界面不同,主要通过命令行完成。本文将介绍Linux系统中常用的命令,包括文件处理、权限管…

    2026年9月1日 用户投稿
    100
  • 在云服务器 ECS上如何删除一份自定义镜像

    本文在介绍云服务器 ecs上如何删除一份自定义镜像的基础上,重点探讨了其具体步骤,本文内容紧凑,希望大家可以有所收获。 DeleteImage 请求参数 返回参数 全是公共返回参数。参阅 公共参数 示例 请求示例 https://ecs.aliyuncs.com/?Action=DeleteImag…

    2026年9月1日
    100
  • Python中pip install sklearn和pip install scikit-learn有什么区别?

    pip install sklearn 与 pip install scikit-learn:细微差别与最佳实践 在 Python 的机器学习领域,您可能会遇到两种安装 scikit-learn 库的命令:pip install sklearn 和 pip install scikit-learn。…

    2026年9月1日
    100
  • 如何强制刷新谷歌浏览器缓存 怎么清理谷歌浏览器所有缓存垃圾

    谷歌浏览器在日常使用中会累积大量的缓存数据,这些文件虽然可以加快网页加载速度,但长期堆积也可能导致浏览器性能下降或页面显示错误。本文将为您详细介绍两种清除谷歌浏览器缓存的方法:一种是针对特定页面的强制刷新,另一种是彻底清理所有缓存垃圾的步骤,帮助您有效地管理和优化浏览器性能。 立即进入“高清国产电影…

    2026年9月1日
    600
  • 调用该接口时如何为一块ECS磁盘创建一份快照

    本文在介绍调用该接口时如何为一块ecs磁盘创建一份快照的基础上,重点探讨了其具体步骤,本文内容紧凑,希望大家可以有所收获。 CreateSnapshot 为一块ECS磁盘创建一份快照。 描述 调用该接口时,您需要注意: 一块磁盘最多能创建64份快照。 磁盘挂载的实例必须处于已停止(Stopped)或…

    2026年9月1日
    100
  • 创建的自动快照策略怎么可以应用到任一磁盘

    创建的自动快照策略怎么可以应用到任一磁盘创建的自动快照策略怎么可以应用到任一磁盘创建的自动快照策略怎么可以应用到任一磁盘创建的自动快照策略怎么可以应用到任一磁盘

    本篇文章给大家带来的内容是关于创建的自动快照策略怎么可以应用到任一磁盘,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 CreateAutoSnapshotPolicy 创建一条自动快照策略。创建的自动快照策略可以应用到任一磁盘(ApplyAutoSnapshotPolicy),成功…

    2026年9月1日 用户投稿
    100
  • 如何为一块或者多块磁盘应用自动快照策略

    本篇文章给大家带来的内容是关于如何为一块或者多块磁盘应用自动快照策略,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 ApplyAutoSnapshotPolicy 为一块或者多块磁盘应用自动快照策略。目标磁盘已经应用了自动快照策略时,调用 ApplyAutoSnapshotPoli…

    2026年9月1日
    100
  • 如何取消正在创建的快照——调用该接口删除快照

    本篇文章给大家带来的内容是关于如何取消正在创建的快照,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 DeleteSnapshot 删除指定的快照。如果需要取消正在创建的快照,也可以调用该接口删除快照,即取消创建快照任务。 描述 调用该接口时,您需要注意: 如果指定的快照 ID 不存…

    2026年9月1日
    200
  • Windows下使用VS2013编译使用SDL库

    Windows下使用VS2013编译使用SDL库Windows下使用VS2013编译使用SDL库Windows下使用VS2013编译使用SDL库Windows下使用VS2013编译使用SDL库

    simple directmedia layer(sdl)是一个跨平台开发库,旨在通过opengl和direct3d提供对音频、键盘、鼠标、操纵杆和图形硬件的低级访问。多种软件,如视频播放工具、仿真器和许多热门游戏(包括valve的获奖作品和humble bundle中的众多游戏)都依赖于它。 SD…

    2026年9月1日 用户投稿
    300
  • 如何取消一块或者多块磁盘的自动快照策略

    本篇文章给大家带来的内容是关于如何取消一块或者多块磁盘的自动快照策略,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 CancelAutoSnapshotPolicy 请求参数 返回参数 全是公共返回参数。参阅 公共参数。 示例 请求示例 https://ecs.aliyuncs.c…

    2026年9月1日
    100
  • linux下怎么停止mysql服务

    linux停止mysql服务的方法:1、在终端中执行“mysqladmin -u root shutdown”命令关闭mysql服务即可;2、在终端中执行“service mysql stop”命令关闭mysql服务即可。 本教程操作环境:linux5.9.8系统、mysql8版本、Dell G3电…

    2026年9月1日
    000
  • 目标自动快照策略已经被应用到磁盘上如何删除一条自动快照策略

    本文在介绍目标自动快照策略已经被应用到磁盘上如何删除一条自动快照策略的基础上,重点探讨了其具体步骤,本文内容紧凑,希望大家可以有所收获。 DeleteAutoSnapshotPolicy 请求参数 返回参数 全是公共返回参数。参阅 公共参数。 示例 请求示例 https://ecs.aliyuncs…

    2026年9月1日
    100
  • 如何查询已创建的自动快照策略

    本文在介绍如何查询已创建的自动快照策略的基础上,重点探讨了其具体步骤,本文内容紧凑,希望大家可以有所收获。 DescribeAutoSnapshotPolicyEx 请求参数 返回参数 示例 请求示例 https://ecs.aliyuncs.com/?Action=DescribeAutoSnap…

    2026年9月1日
    000
  • pip install sklearn 和 pip install scikit-learn 有何区别?会自动安装依赖包吗?

    pip install sklearn 和 pip install scikit-learn 的差异及依赖包安装 许多开发者在安装 scikit-learn 库时,常常会混淆 pip install sklearn 和 pip install scikit-learn 这两个命令。 实际上,它们之间…

    2026年9月1日
    000
  • win10系统32位和64位的区别

    win10系统32位和64位的区别win10系统32位和64位的区别win10系统32位和64位的区别win10系统32位和64位的区别

    近年来,随着电脑操作系统的不断更新换代,我们在选择系统时常常感到困惑。尤其是关于win10系统的32位与64位版本,许多用户在安装系统时都会纠结到底该选哪一个。今天,小编就来为大家详细讲解这两个版本的区别,帮助大家做出更合适的选择。 如果电脑配置较高,建议选择win10的64位系统。 64位系统在数…

    2026年9月1日 用户投稿
    300
  • 如何查询磁盘一个磁盘所有快照组成的关系链

    本篇文章给大家带来的内容是关于如何查询磁盘一个磁盘所有快照组成的关系链,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 DescribeSnapshotLinks 查询磁盘快照链。快照链是一个磁盘所有快照组成的关系链,一个磁盘对应一条快照链,所以快照链 ID 即磁盘 ID。 描述 调…

    2026年9月1日
    000
  • 如何快速简单的在安全组内查询安全组详情

    本篇文章给大家带来的内容是关于如何快速简单的在安全组内查询安全组详情,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 DescribeSecurityGroupAttribute 请求参数 返回参数 示例 请求示例 https://ecs.aliyuncs.com/?Action=D…

    2026年9月1日
    100
  • 如何查询创建的安全组的基本信息并且返回列表按照安全组ID降序排列

    本文在介绍如何查询创建的安全组的基本信息并且返回列表按照安全组id降序排列的基础上,重点探讨了其具体步骤,本文内容紧凑,希望大家可以有所收获。 DescribeSecurityGroups 请求参数 返回参数 示例 请求示例 https://ecs.aliyuncs.com/?Action=Desc…

    2026年9月1日
    100
  • React Router v6中Link组件relative属性:route和path的区别是什么?

    深入理解react router v6中link组件的relative属性:route与path的差异 React Router v6的Link组件拥有relative属性,其值可设置为route或path,决定链接路径的解析方式。本文将详细解释两者区别,并辅以示例说明。 官方文档对relative…

    2026年9月1日
    100

发表回复

登录后才能评论
关注微信