我正在研究一个bash脚本,该脚本收集CentOS服务器上的各种诊断信息并打包它们,以便将它们发送到我们公司进行分析。作为此脚本的一部分,我检查公司的应用程序是否响应。如果不是,我会触发申请流程的核心转储:
kill -6 $app_pid
此命令将导致为pid $app_pid
写入进程核心转储。但是,我需要一种等待核心转储生成完成的方法。否则,由于核心转储不完整,我可能会创建损坏的诊断包。
我希望使用默认的centos软件包进行此检查,但如果必须,我也可以安装其他软件包。
答案 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
到目前为止,似乎已经成功了。