sudo运行进程无法生成core dump的问题咨询与解决
已在/etc/security/limits.conf中添加以下配置并重启系统:
root soft core unlimited * soft core unlimited
当前普通用户及通过sudo su切换到root时,均能正常生成core dump,执行ulimit -a显示core文件大小为unlimited。但以普通用户执行sudo bash -c "ulimit -a"时,输出的core文件大小为0;且通过sudo运行的进程因SIGSEGV等信号终止时,不会在/var/lib/apport/coredump/目录生成core dump,执行sudo bash -c "ulimit -c unlimited"也无法解决。
想弄明白:为什么sudo的core dump限制和root用户不同?该如何解决?
sudo自带安全策略,默认会重置大部分环境变量和资源限制,目的是防止普通用户通过继承环境变量或资源限制提升权限、泄露敏感信息。/etc/security/limits.conf的配置属于PAM模块的会话限制,但sudo默认不会完全继承这些限制,而是按照自身配置重新设置资源限制,其中就包括将core文件大小限制重置为0。
而sudo su能保留core限制的原因是:su会启动新的登录会话,重新加载PAM的限制配置,相当于初始化了root用户的完整环境,因此能读取到limits.conf中的设置。
方法1:修改sudo配置持久保留core限制
使用visudo命令编辑sudoers文件(必须用visudo,它会自动检查语法错误,避免配置失效导致sudo无法使用),添加以下任意一种配置:
- 允许sudo保留用户的core限制环境变量:
Defaults env_keep += "RLIMIT_CORE" - 直接设置sudo默认的core限制为unlimited:
Defaults core=unlimited
保存退出后,重新执行sudo bash -c "ulimit -a",就能看到core文件大小变为unlimited,此时sudo运行的进程触发崩溃时也会正常生成core dump。
方法2:临时保留环境执行sudo
如果只是临时需要,可以使用sudo -E参数强制保留用户环境(前提是sudoers配置中未禁止env_keep相关设置):
sudo -E bash -c "ulimit -a"
这种方法仅临时生效,每次执行sudo都需要加-E,不如修改sudo配置持久有效。
额外检查:apport配置
若修改sudo配置后仍无法生成core dump,可检查apport的配置文件/etc/apport/crashdb.conf,确保Default段中的enable设置为1;同时确认/var/lib/apport/coredump/目录的权限为root:adm、权限值为750,保证apport有权限写入core文件。
内容的提问来源于stack exchange,提问作者JenyaKh

