找出核心转储何时完成

时间:2017-07-24 19:47:05

标签: linux bash coredump

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

kill -6 $app_pid

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

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

2 个答案:

答案 0 :(得分:1)

为您提供最大控制权的机制是在/proc/sys/kernel/core_pattern中指定管道。这将使您在创建coredump时执行您选择的程序,以便程序可以100%确定它在其stdin文件描述符处于EOF条件时(并且仅当!)时具有完全转储。请参阅man 5 core中的“将核心转储管道压缩到程序”部分。

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

因此,如果您有一个名为form

的文件
/var/lib/systemd/coredump/core.*.lz4

(或者使用您选择的压缩算法的扩展名),您已经可以确信它已经完成,因为该文件已经编写并且在之前将其权限设置为,它已重命名为该最终名称

如果您使用systemd,并且您不想实现自己的流程来处理管道接口,那么通用方法是:fuser可用于确定是否有任何进程对文件具有打开句柄。因此:

fuser -f core

...仅在正在运行的进程打开核心转储时才会发出输出。

答案 1 :(得分:0)

我能够使用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

到目前为止,似乎已经成功了。