本文目录导读:

- 使用Docker运行容器时设置PID限制
- 使用Podman运行容器
- 使用containerd/nerdctl运行容器
- 通过cgroup直接配置(底层方法)
- 完整的Shell脚本示例
- 监控和测试PID限制
- 高级配置:动态调整PID限制
- 注意事项
在Shell脚本中配置容器的PID限制,主要取决于你使用的容器运行时(Docker、containerd/podman等),以下是几种常见方法的实现:
使用Docker运行容器时设置PID限制
通过docker run命令参数
#!/bin/bash # Docker运行时限制PID数量 docker run -d \ --name my_container \ --pids-limit 100 \ # 限制最大PID数量为100 --memory 512m \ --cpus 0.5 \ nginx:latest echo "容器已启动,PID限制:100"
在docker-compose.yml中配置
# docker-compose.yml
version: '3.8'
services:
web:
image: nginx:latest
deploy:
resources:
limits:
pids: 100 # 限制PID数量
pids_limit: 100 # 或使用此语法
使用Podman运行容器
#!/bin/bash # Podman限制PID podman run -d \ --name my_container \ --pids-limit=100 \ --memory 512m \ nginx:latest echo "Podman容器已启动,PID限制:100"
使用containerd/nerdctl运行容器
#!/bin/bash # nerdctl限制PID nerdctl run -d \ --name my_container \ --pids-limit 100 \ nginx:latest
通过cgroup直接配置(底层方法)
对于更底层的控制,可以直接配置cgroup:
#!/bin/bash
# 创建容器
CONTAINER_NAME="my_container"
CONTAINER_ID=$(docker run -d --name $CONTAINER_NAME nginx:latest)
# 获取容器的cgroup路径
CGROUP_PATH=$(docker inspect --format '{{.HostConfig.CgroupParent}}' $CONTAINER_NAME)
if [ -z "$CGROUP_PATH" ]; then
# 如果为空,使用默认路径
CGROUP_PATH="/sys/fs/cgroup/pids/docker/$CONTAINER_ID"
fi
# 设置PID限制(例如100)
echo 100 | sudo tee "$CGROUP_PATH/pids.max"
echo "已为容器 $CONTAINER_NAME 设置PID限制:100"
完整的Shell脚本示例
#!/bin/bash
# 设置PID限制的完整脚本
LIMIT=${1:-100} # 默认限制100个PID
IMAGE=${2:-nginx:latest}
CONTAINER_NAME="limited_container_$(date +%s)"
echo "=== 容器PID限制配置脚本 ==="
echo "PID限制值: $LIMIT"
echo "使用镜像: $IMAGE"
echo "容器名称: $CONTAINER_NAME"
# 检查Docker是否运行
if ! docker info > /dev/null 2>&1; then
echo "错误: Docker未运行"
exit 1
fi
# 启动容器并设置PID限制
docker run -d \
--name "$CONTAINER_NAME" \
--pids-limit "$LIMIT" \
--memory 256m \
--cpus 0.25 \
"$IMAGE"
if [ $? -eq 0 ]; then
echo "✓ 容器已成功启动"
echo "容器ID: $(docker ps -q -f name=$CONTAINER_NAME)"
echo "PID限制: $LIMIT"
# 验证配置
echo ""
echo "验证PID限制配置:"
docker inspect --format '{{.HostConfig.PidsLimit}}' "$CONTAINER_NAME"
else
echo "✗ 容器启动失败"
exit 1
fi
# 显示帮助信息
echo ""
echo "用法: $0 [限制数量] [镜像名称]"
echo "示例: $0 200 nginx:latest"
监控和测试PID限制
#!/bin/bash
# 测试PID限制的脚本
CONTAINER_NAME="test_container"
# 启动容器
docker run -d --name $CONTAINER_NAME --pids-limit 50 alpine sleep 3600
echo "启动进程爆炸测试..."
# 创建大量进程测试限制
docker exec $CONTAINER_NAME sh -c '
echo "尝试创建大量进程..."
for i in $(seq 1 100); do
(while true; do sleep 3600; done) &
if [ $? -ne 0 ]; then
echo "进程创建失败,达到限制"
break
fi
done
wait
' &
sleep 5
# 监控状态
echo "当前容器的进程数:"
docker top $CONTAINER_NAME | wc -l
# 清理
echo "清理测试容器..."
docker stop $CONTAINER_NAME
docker rm $CONTAINER_NAME
高级配置:动态调整PID限制
#!/bin/bash
# 动态调整已有容器的PID限制
adjust_pid_limit() {
local container_name=$1
local new_limit=$2
echo "正在调整容器 $container_name 的PID限制为 $new_limit"
# 方法1:使用docker update
docker update --pids-limit "$new_limit" "$container_name"
# 方法2:直接修改cgroup(需要root权限)
# local cgroup_path=$(find /sys/fs/cgroup/pids -name "*$container_name*" 2>/dev/null | head -1)
# if [ -n "$cgroup_path" ]; then
# echo $new_limit | sudo tee "$cgroup_path/pids.max"
# fi
echo "调整完成"
}
# 使用示例
# adjust_pid_limit "my_container" 200
注意事项
- PID限制值:Linux系统默认每个进程的PID范围是0-32768,设置过小可能导致服务无法正常启动
- 系统限制:容器的PID限制不能超过主机的PID最大值(
/proc/sys/kernel/pid_max) - 兼容性:确保Docker版本支持
--pids-limit参数(Docker 1.11+支持) - 容器类型:某些基础镜像(如基于busybox)可能不支持子进程管理
选择哪种方法取决于你的具体需求和容器运行时环境,通常推荐使用Docker/Podman提供的参数直接配置,既简单又可靠。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播