查看核心转储何时完成

Find out when core dump is finished

我正在编写一个bash脚本,它收集CentOS服务器上的各种诊断信息并将它们打包,以便将它们发送到我们公司进行分析。作为此脚本的一部分,我检查公司的应用程序是否响应。如果不是,我触发应用程序进程的核心转储:

kill -6 $app_pid

此命令将导致为 pid $app_pid 写入进程核心转储。但是,我需要一种方法来等待核心转储生成完成。否则,由于核心转储不完整,我可能会创建损坏的诊断包。

我希望使用默认的 centos 软件包进行此检查,但如果必须的话,我也愿意安装其他软件包。

为您提供最大控制权的机制是在 /proc/sys/kernel/core_pattern 中指定管道。这将让您选择的程序在创建 coredump 时执行,因此该程序可以 100% 确定当(且仅当!)其标准输入文件描述符处于 EOF 条件时它具有完整转储。请参阅 man 5 core 中的 "Piping core dumps to a program" 部分。

如果您使用的是 systemd(如 CentOS 的现代版本),systemd-coredump 程序将已经以这种方式自行配置。 systemd-coredump 压缩完成后从临时名称重命名文件,因此它已经完成了确保您只有一个完整的核心转储准备好记录的工作。

因此,如果您有一个名为以下形式的文件:

/var/lib/systemd/coredump/core.*.lz4

(或者使用您选择的压缩算法的扩展),您已经可以确信它是完整的,因为该文件已被写入并设置了权限 before 它是重命名为最终名称。

我可以使用 inotifywait 让我的脚本等待核心转储写入完成。请参阅以下代码段:

core_file="core.$app_pid"
core_path=/path/core/file/dir
core_complete="false"
# Setup inotifywait loop to wait until core file has been complety written
inotifywait -e close_write --format '%f' $core_path | while read line; do
  echo "File $line was closed"
  # Check to see if the line we read was the core file
  if [[ "$line" == "$core_file"  ]]; then
    echo "Core file write complete"
    core_complete="true"
  fi
done

到目前为止,这似乎可以解决问题。