当前位置: 首页 > news >正文

从root用户切换到某个普通用户突然报错“su: failed to execute /bin/bash: 资源暂时不可用”

背景:

当你从 root 用户使用 su 切换到某个普通用户时,出现错误:

su: failed to execute /bin/bash: 资源暂时不可用

这个错误的英文原文通常是:

su: failed to execute /bin/bash: Resource temporarily unavailable

这表示系统在尝试为新用户启动 shell(这里是 /bin/bash)时,由于某种资源限制而失败。尽管你是 root,但目标用户的会话仍然受到其用户级别的资源限制约束。

常见原因及排查方法:


✅ 1. 用户进程数(max user processes)达到上限

这是最常见的原因。系统对每个用户允许运行的最大进程数有限制(由 ulimit -u 控制)。

排查方法:

# 查看当前 root 的进程数限制
ulimit -u# 查看目标普通用户当前的进程数(切换前可用)
ps -u username --no-heading | wc -l

如果该用户已经有大量进程在运行(例如后台脚本、ssh 会话、screen/tmux 等),再 su 就可能无法创建新进程。

解决方法:

  • 终止该用户无用的进程:

    pkill -u username
    # 或者更谨慎地 kill
    pkill -u username command_name
    
  • 临时提高限制(需修改 limits.conf):

    # 编辑 /etc/security/limits.conf
    username    soft    nproc    4096
    username    hard    nproc    8192
    

    注意:修改后需重新登录才生效。


✅ 2. 系统级进程/线程数接近上限

查看系统整体的进程数限制和当前使用情况:

# 查看最大线程数(也限制进程数)
cat /proc/sys/kernel/threads-max
cat /proc/sys/kernel/pid_max# 查看当前系统已使用的进程数
ps aux | wc -l

如果系统接近这些上限,也会导致无法创建新进程。


✅ 3. 内存不足或OOM(Out of Memory)

虽然错误提示不是“内存不足”,但在极端内存耗尽的情况下,内核可能拒绝 fork 新进程。

检查:

free -h
dmesg | grep -i "oom\|kill"
journalctl | grep -i "oom\|kill"

如果看到 Out of memory: Kill process,说明系统曾因内存不足杀掉进程,可能导致资源紧张。


✅ 4. PAM 或 limits 配置问题

PAM 模块(如 pam_limits.so)在 su 时会加载用户的资源限制。如果 /etc/security/limits.conf 设置过严,或 PAM 配置缺失,可能导致问题。

确认 /etc/pam.d/su 是否包含:

session    required   pam_limits.so

如果没有这行,ulimit 设置可能不生效或异常。


✅ 5. 目标用户的 shell 被占用或异常

极少数情况下,如果用户的 shell(如 /bin/bash)被大量进程占用,或 shell 初始化脚本(.bashrc.profile)中有死循环/无限递归,也可能导致“资源不可用”。

测试方法:

su - username -s /bin/sh

尝试换一个更轻量的 shell,看是否成功。


✅ 6. 容器或虚拟化环境资源限制

如果你在 Docker、LXC、Kubernetes 或某些虚拟化环境中,宿主机可能对容器设置了严格的 cgroup 限制(如 pids.limit)。

检查:

# 查看当前 cgroup 的进程数限制
cat /sys/fs/cgroup/pids/user.slice/user-$(id -u).slice/pids.max
cat /sys/fs/cgroup/pids/user.slice/user-$(id -u).slice/pids.current

如果 pids.current 接近 pids.max,说明已达上限。


✅ 快速诊断命令总结:

# 1. 查看目标用户当前进程数
ps -u username | wc -l# 2. 查看系统进程总数
ps aux | wc -l# 3. 检查 limits
ulimit -a# 4. 查看是否有 OOM
dmesg | grep -i oom
journalctl | grep "killed process"# 5. 检查 cgroup 限制(如有)
cat /sys/fs/cgroup/pids/pids.max

✅ 解决方案建议:

  1. 重启或清理目标用户的进程(最直接)。
  2. 调整 /etc/security/limits.conf,增加 nproc 限制。
  3. 确保 pam_limits.so 已启用
  4. 检查系统资源(内存、进程总数)是否充足
  5. 在容器环境中检查 cgroup 限制

请根据你的环境运行上述诊断命令,定位具体是哪种资源受限。如果提供 ps -u username 和 ulimit -a 的输出,可以进一步帮你分析。

http://www.dtcms.com/a/399000.html

相关文章:

  • 沧州网站建设制作设计优化浏览器提醒 WordPress
  • 网站风格什么意思快速优化系统
  • 陕西创程教育:点亮职业人生的明灯
  • AR智能巡检:工业培训的效率的革新
  • 栈实现队列方法与优化
  • 设计模式-建造者模式详解
  • 卫星产业全景图:从制造到应用的星辰大海
  • 青海西宁网站开发公司网站建设要哪些人?
  • (5)tauri 日志
  • 宿迁网站开发网站开发必备技能
  • 如何选择合适的服务器租用商?
  • 网站rar文件专业免费网站建设
  • MySQL在服务器和参数化方面的通用调优策略详解
  • PaddleOCR 本地部署与 MCP 服务调用指南(Mac Intel CPU)
  • 开源的自动化平台
  • python+django/flask哈利波特书影音互动科普网站
  • SRC-文件上传导致XSS
  • 襄阳做网站的用 net做网站
  • 中式建筑公司网站青岛装饰公司十强排名
  • CSS网页设计实战——车辆购物页面
  • PyTorch 神经网络模型构建与核心工具详解
  • PHP 线上环境 Composer 依赖包更新部署指南
  • SQLCipher数据库的引用、创建、打开
  • 【 设计模式 | 创建型模式 建造者模式 】
  • 飞虹网架建设官方网站网站建设类有哪些职位
  • 公司网站做地图地址wordpress 固态链接
  • 4.4 I2C写数据
  • 代码审计-PHP专题MVC开发文件差异对比法模版引擎SSTI注入RCE执行1day分析
  • 使用IOT-Tree消息流MQTT模块节点实现监测数据推送功能
  • 网站开发团队取什么名字好监测网站空白栏目