2016-08-05 159 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

相关问题