2016-08-05 188 views
0

我有一個從腳本運行的進程myprocess。是否有可能檢查此過程是否成功執行或崩潰?如何知道正在運行的後臺進程是否爲

這是我的腳本看起來像

myprocess 12 & 
sleep 12 
# I want to check here if the process crashed 

爲什麼我在運行過程中的背景原因很簡單。我想在sleep之前完成其他任務。醒來後,我想看看這個過程是否正常退出或崩潰(轉儲核心)。

PS:如果需要其他細節或更多代碼,請在下面留言。

+0

哪個操作系統? – pah

+0

我正在使用linux –

+0

你不能任意假定內核允許核心轉儲。內核參數'fs.suid_dumpable'允許/禁止核心轉儲。在大多數RHEL 6.8+派生中,這被設置爲禁止。您還需要找到放置核心轉儲的位置。默認值是在'pwd'中,但它可以配置爲轉儲到其他地方並使用不同的名稱模式。這在'kernel.core_pattern'中設置。 – alvits

回答

3

假設你DO NOT HAVE名爲上core文件您$PWD(否則會被刪除),這是辦法做到這一點:

(請注意,這 [在核心文件的方法只有]假設的sysctl的正確參數化fs.suid_dumpable如果myprocess將其privilege levels changed or is execute only。還要注意的是kernel.core_pattern設置可能會導致核心文件轉儲somewh其他人不在$PWD。請參閱this article以正確設置它。感謝@alvits指出了這兩個潛在的問題。無論如何,我真的不推薦以下核心文件的方式的使用。)

#!/bin/bash 

rm -f core 
ulimit -c unlimited 

myprocess 12 & 

# ... Do your stuff ... 

sleep 12 

if [ -f core ]; then 
    echo "This is a minimal example to show that the program dumped core." 
fi 

另外請注意,這僅適用於如果同時沒有別的轉儲核心$PWD

一個清潔做法:

#!/bin/bash 

(rm -f /tmp/myprocess.success && myprocess 12 && touch /tmp/myprocess.success) & 

# ... Do your stuff ... 

sleep 12 

if [ -f /tmp/myprocess.success ]; then 
    echo "myprocess returned EXIT_SUCCESS. But if it didn't returned before sleep 12 elapsed, this will fail." 
fi 

正確辦法做到這一點:

#!/bin/bash 

myprocess & 

# Store myprocess PID 
MYPROCESS_PID="$!" 

# ... Do your stuff here .... 

# Wait until myprocess returns 
wait "${MYPROCESS_PID}" 

# Store myprocess exit status (returned by wait) 
$ret="$?" 

if [ "${ret}" -gt 0 ]; then 
    echo "Myprocess didn't exited with EXIT_SUCCESS" 
fi 
+1

您可能想要添加一個註釋,第一個解決方案依賴'fs.suid_dumpable'來爲具有setuid(通常是關閉的)和'kernel.core_pattern'的應用程序確定核心的位置和名稱模式。 OP和未來的讀者可能會失望,如果它不適合他們的環境。 – alvits

+0

當然,雖然我不建議在這種情況下使用第一種方法。但會更新。謝謝。 – pah

+0

無論如何,據我所知,fs.suid_dumpable隻影響setuid二進制文件,我不認爲這是OP的情況。 – pah

相關問題