Play Open
Loading Please wait Loading Please wait Loading Please wait Loading Please wait Loading Please wait Loading Please wait

如何避免进程被意外终止?

如何避免进程被意外终止?

在Linux系统中,进程可能因OOM Killer、用户误操作或资源限制等原因被意外终止。为了保障关键业务的稳定运行,需要从多个层面进行防护和优化。本文将深入探讨如何防止关键进程被OOM Killer杀掉、如何避免普通用户误杀进程、以及如何设置资源限制以防止进程异常退出。

1. 防止关键进程被OOM Killer杀掉

OOM Killer(Out of Memory Killer)是Linux内核在内存不足时启动的一个机制,它会根据评分算法选择并终止某些进程来释放内存。

调整OOM评分: 每个进程都有一个OOM评分值(/proc/[pid]/oom_score_adj),范围为-1000到1000,默认为0。数值越低,越不容易被OOM Killer选中。示例命令:

echo -500 > /proc/1234/oom_score_adj

该命令将PID为1234的进程的OOM评分调低,降低其被OOM Killer选中的概率。

完全禁止OOM Killer杀掉某个进程: 将oom_score_adj设为-1000即可。

echo -1000 > /proc/1234/oom_score_adj

2. 如何避免普通用户误杀进程

普通用户可能通过kill、killall等命令误杀关键进程,可以通过以下方式规避风险:

使用权限控制: 通过Linux的权限机制(如SELinux、AppArmor)限制非root用户对关键进程的操作权限。设置进程归属用户: 关键服务应以独立账户运行,并配置sudo权限仅允许特定用户执行相关操作。禁用SIGTERM/SIGKILL信号处理: 进程可通过注册信号处理器忽略或延迟响应某些信号,从而避免被立即终止。

# 示例:忽略SIGTERM信号

signal(SIGTERM, SIG_IGN);

3. 设置资源限制以防止进程异常退出

系统资源限制(如最大打开文件数、内存使用量)可能导致进程被强制终止,需合理设置资源限制。

使用ulimit: 在shell中设置单个进程的资源上限,如最大内存、最大打开文件数等。示例:

ulimit -v 2097152 # 设置虚拟内存最大为2GB

配置/etc/security/limits.conf: 可永久设置用户或组的资源限制。

* soft nofile 65536

* hard nofile 131072

4. 使用cgroup限制资源

Control Groups(cgroups)是Linux内核提供的资源管理机制,可以用于限制、记录和隔离进程组使用的物理资源。

创建cgroup组:

mkdir /sys/fs/cgroup/memory/mygroup

echo 1234 > /sys/fs/cgroup/memory/mygroup/tasks

限制内存使用:

echo 536870912 > /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes

该命令将进程1234的内存使用限制为512MB。

5. 使用守护进程提高稳定性

守护进程(Daemon)是指在后台运行且脱离终端控制的进程,适合长期运行的关键任务。

编写守护进程的基本步骤:fork子进程,父进程退出;调用setsid创建新会话;改变当前工作目录;重设umask;关闭不需要的文件描述符。

使用systemd管理守护进程可进一步提升可靠性。

6. 综合防护策略流程图

下面是一个综合策略的mermaid流程图,展示了从进程创建到资源监控与保护的全过程:

graph TD

A[创建关键进程] --> B[设置OOM评分]

B --> C[加入cgroup资源组]

C --> D[配置ulimit资源限制]

D --> E[注册信号处理函数]

E --> F[部署systemd服务管理]

F --> G[定期健康检查]

G --> H{是否正常运行?}

H -- 是 --> I[继续运行]

H -- 否 --> J[自动重启或告警]

Posted in 卡池解析
Previous
All posts
Next