如何让 Ubuntu 启动时由 init.d 启动的守护进程转储到 coredump?这是我目前所做的...
echo "ulimit -c unlimited" >> /etc/profile
mkdir /corefiles/
chmod 777 /corefiles/
echo "kernel.core_pattern=/corefiles/core.%e.%u.%t" >> /etc/sysctl.conf
echo "fs.suid_dumpable=1" >> /etc/sysctl.conf
echo "kernel.core_uses_pid = 1" >> /etc/sysctl.conf
sysctl -p
这对于除由 init.d 在启动时启动的守护进程之外的所有程序都非常有用。我正在运行 Ubuntu 10.04。我正在寻找一种不需要编辑每个守护进程 init.d 文件的解决方案。
编辑:此外,以 sudo 启动的守护进程不会进行核心转储。
答案1
为什么不使用阿波特? 它在非开发版本的 Ubuntu 上默认是禁用的,但据我所知它仍然默认安装。
答案2
/etc/profile
当用户登录进行交互式会话时执行(即使如此,这也取决于登录方法和登录 shell)。它对引导时启动的守护进程没有影响。
显然(我还没有测试确认)Ubuntu 10.04 上的核心转储一开始是禁用的。可以通过在中设置非零大小限制来启用它们/etc/security/limits.conf
。请参阅该文件中的注释和limits.conf
手册页以获取更多信息。我认为你需要添加一行,例如
* soft core 2000000
具有提升权限的程序通常不会转储核心(我不知道确切的规则)。这可能会影响通过提升权限直接启动的进程,例如sudo foo
;尝试sudo sh -c foo
改为(以便子进程以其最终权限级别启动)。
答案3
/etc/profile
仅由您的登录 shell 提供,而不是由 initscripts 提供。
/etc/security/limits.conf
也只会影响登录会话,因为这些限制是由pam_limits.so
;来自 pam_limits 手册页:
pam_limits PAM 模块设置了用户会话中可获取的系统资源的限制。
要获得所需的行为,您应该修改 initscript 并插入ulimit -c unlimited
命令。正如 Dom 提到的,您也可以通过编辑 lsb init-functions 库来做到这一点。
答案4
我认为所有这些选项对于您启动的守护进程都是必需的。要获得核心转储,您应该将 ulimit 命令添加到启动器的开头。启动器应该使用/lib/lsb/init 函数。所以您可以根据需要进行修改。我这里不测试任何东西,所以请尝试一下!