2017-07-24 107 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 

...會發出輸出。