![如何在不禁用 apport 的情况下编辑核心转储模式?](https://linux22.com/image/980730/%E5%A6%82%E4%BD%95%E5%9C%A8%E4%B8%8D%E7%A6%81%E7%94%A8%20apport%20%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E7%BC%96%E8%BE%91%E6%A0%B8%E5%BF%83%E8%BD%AC%E5%82%A8%E6%A8%A1%E5%BC%8F%EF%BC%9F.png)
/etc/limits.conf
目前我已经通过编辑和添加* soft core unlimited
以及使用启用了核心转储ulimit -c unlimited
。
但核心模式是这样的:
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %P
因此核心被传输到 apport。我不介意,也不想弄乱 apport(我记得这样做时出了点问题),而且当二进制文件崩溃时,apport 会很好地core
在我的二进制文件的目录中生成一个文件。
有什么方法可以编辑 apport 保存核心的位置或其文件名(而不是简单的core
)?类似于我通过禁用 apport 并编辑 所做的操作core_pattern
,但不禁用 apport。
答案1
您可以编辑 apport python 文件来执行此操作。更改核心的位置很简单:而不是
core_path = os.path.join(cwd, 'core')
你可以放
core_path = os.path.join('my_custom_path, 'core)
也可以用类似的方式更改名称,即:
core_path += '.' + str(pid)
到
core_path += '.' + str(my_custom_name) + '.' + str(pid)
请注意,如果您想将二进制名称添加到核心文件,则必须使用 core_pattern 将其传递给 apport,即
|/usr/share/apport/apport %p %s %c %d %P %e
注意%e
上面将可执行文件名称传递给 apport 脚本
更改脚本后记得重启 apport 服务
答案2
对 OP 的回复晚了,但也许这会对其他人有所帮助。
我试图做一些类似的事情,使用 systemd 服务在启动时启用核心转储(以防设置被另一个开发人员/部署更改)。
我也遇到了 apport 覆盖 core_pattern 的问题:
kernel.core_pattern = |/usr/share/apport/apport %p %s %c %P
因为我不想禁用 apport,所以我能够通过在 apport 之后触发我的服务来绕过 apport 路径:
[Unit]
Description=Enable Core Dumps
After=apport
[Service]
ExecStart=/usr/bin/enable_core_dump.sh
[Install]
WantedBy=multi-user.target
然后我可以从 bash 脚本中更改核心转储位置和命名约定。
答案3
我找到了一种更好的方法,因为对 apport 进行更改意味着每次我们升级 apport 时我们都必须添加我们的更改。
Linux 允许您提供 shell 脚本作为每次生成核心时执行的程序。在此核心文件中,您可以像往常一样调用 apport,然后执行自定义操作。这包括更改核心文件的名称和位置。
要找到 apport 生成的核心的路径,可以使用以下命令
core_dir=realpath '/proc/$1/cwd'