2017-07-24 102 views
1

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

kill -6 $app_pid 

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

我希望使用默认的centos软件包进行检查,但如果必须的话,我也打算安装额外的软件包。

+0

我不确定这是一个超过[unix.se]或[超级用户](https://superuser.com/)问题的StackOverflow问题。这是关于在编写代码时确定肯定是恰当的,但在这种情况下绝不仅仅**相关 - 尝试进行手动确定的系统管理员可能会有同样的问题。 –

+0

顺便说一句 - 哪个版本的CentOS,到底是什么?如果你是基于systemd的,那么你可以使用'systemd-coredump'。 –

+0

我们仍然在为我们的应用程序服务器使用CentOS 6。 – Andrew

回答

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 

这至今似乎这样的伎俩。

1

为您提供最大控制的机制是在/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 

...会发出输出。