找出核心转储何时完成
我正在研究一个bash脚本,它收集CentOS服务器上的各种诊断信息,并将它们打包,以便将它们发送到我们公司进行分析。作为该脚本的一部分,我检查公司的应用程序是否具有响应能力。如果不是,我触发应用程序的核心转储:找出核心转储何时完成
kill -6 $app_pid
此命令将导致进程核心转储为PID $app_pid
写入。但是,我需要等待核心转储生成完成。否则,由于核心转储不完整,我可以创建损坏的诊断程序包。
我希望使用默认的centos软件包进行检查,但如果必须的话,我也打算安装额外的软件包。
我能够通过使用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
这至今似乎这样的伎俩。
为您提供最大控制的机制是在/proc/sys/kernel/core_pattern
中指定管道。当创建一个coredump时,这会让你选择的程序执行,这样程序可以100%确定当它的标准输入文件描述符处于EOF状态时(并且只有当!)时才能完全转储。请参阅man 5 core
中的“管道核心转储到程序”一节。
如果您使用的是systemd(与现代版本的CentOS相同),systemd-coredump
程序将以这种方式进行配置。 systemd-coredump
在压缩完成时从临时名称重命名文件,因此它已经完成了确保只有一个完整的coredump可以记录的工作。
因此,如果你有一个名为形式的文件:
/var/lib/systemd/coredump/core.*.lz4
(或以其他方式与您所选择的压缩算法的扩展名),你已经可以放心,它是完整的,因为该文件被写入并在之前将其权限设置为,并将其重命名为最终名称。
如果不使用systemd,你不想实现自己的进程来处理管道的接口,所以很一般采用的方式:fuser
可以用来确定的任何进程是否有打开文件的句柄。因此:只有一个核心转储是一个正在运行的进程开放
fuser -f core
...会发出输出。
我不确定这是一个超过[unix.se]或[超级用户](https://superuser.com/)问题的StackOverflow问题。这是关于在编写代码时确定肯定是恰当的,但在这种情况下绝不仅仅**相关 - 尝试进行手动确定的系统管理员可能会有同样的问题。 –
顺便说一句 - 哪个版本的CentOS,到底是什么?如果你是基于systemd的,那么你可以使用'systemd-coredump'。 –
我们仍然在为我们的应用程序服务器使用CentOS 6。 – Andrew