我正在编写一个 bash 脚本,用于收集 CentOS 服务器上的各种诊断信息并将它们打包,以便将它们发送到我们公司进行分析。作为此脚本的一部分,我检查公司的应用程序是否响应。如果不是,我会触发应用程序进程的核心转储:
kill -6 $app_pid
此命令将导致为 pid $app_pid
写入进程核心转储。但是,我需要一种方法来等待核心转储生成完成。否则,由于核心转储不完整,我可能会创建损坏的诊断包。
我希望使用默认的 centos 软件包进行此检查,但如果必须的话,我也愿意安装其他软件包。
最佳答案
为您提供最大控制权的机制是在 /proc/sys/kernel/core_pattern
中指定管道。这将让您选择的程序在创建 coredump 时执行,因此该程序可以 100% 确定当(且仅当!)其标准输入文件描述符处于 EOF 条件时它具有完整转储。请参阅 man 5 core
中的“将核心转储传输到程序”部分.
如果您正在使用 systemd(如 CentOS 的现代版本),systemd-coredump
程序将已经以这种方式自行配置。 systemd-coredump
在压缩完成时从临时名称重命名文件,因此它已经完成了确保您只有一个完整的 coredump 准备好记录的工作。
因此,如果您有一个以以下形式命名的文件:
/var/lib/systemd/coredump/core.*.lz4
(或者通过您选择的压缩算法的扩展),您已经可以确信它是完整的,因为该文件是在 重命名为最终名称之前编写并设置了权限的.
关于linux - 查看核心转储何时完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45288871/