突然,我的 postgresql 服务由于某种原因开始崩溃。我想生成 coredump 文件,但文件没有生成。
我设置了:“ulimit -S -c unlimited”,还在 /etc/security/limits.conf 中添加了行“*soft core unlimited”。
还将我的目标目录设置为 kernel.core_pattern="/coredumps/core-%e-%s-%u-%g-%p-%t"。还对目标路径执行了“chmod 777”以消除权限问题。我能够通过执行“perl -MPOSIX -e '$0="ttt"; pause' &”然后运行“kill -ABRT ”来生成测试 coredump 文件,并且文件以正确的文件名保存到 /coredumps。
当我的 postgres 崩溃时我可以在日志中看到:
资源限制禁用进程 3607766 (postmaster) 的核心转储。
用户 26 的进程 3607766(邮政局长)已转储核心。
我还注意到我的测试进程和 postgres 之间的“cat /proc/pid/limits”输出存在差异。测试进程将“最大核心文件大小”设置为“无限制”,将 postgresql 值设置为“0”
限制不是系统范围的——它们是每个进程的,初始化和继承方式与环境变量类似。
ulimit
因此,您的命令只会提高您输入该命令的 Bash 实例的核心转储限制——不会提高其他任何人或任何服务的核心转储限制。这些限制是从 /etc/security/limits.conf 为用户登录初始化的;但是在 Linux 上,即使服务有服务帐户,也不会经过“用户登录”过程,因此不会发生从 /etc/security 进行的限制初始化。
相反,所有这些限制都需要通过启动 Postgres 的服务管理器来设置 - 在本例中为 systemd,因此您需要使用
systemctl edit
该选项添加LimitCORE=
到 .service 文件中。或者,您可以使用该
prlimit
命令来更改已经运行的进程的资源限制,假设它在崩溃之前仍可以运行一小段时间。