2016-08-05 3 views
0

У меня есть процесс myprocess, который я запускаю из сценария. Можно ли проверить, успешно ли этот процесс или сбой?Как узнать, работает ли работающий фоновый процесс

Это как мой сценарий выглядит

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

Причина, почему я бегу процесс в фоновом режиме просто. Я хочу выполнять другие задачи до sleep ing. После того, как я просыпаюсь, я хочу посмотреть, прошел ли процесс изящно или он разбился (сброшенное ядро).

PS: Просьба прокомментировать ниже, если требуются какие-либо другие данные или более код.

+0

Какая операционная система? – pah

+0

Я использую linux –

+0

Вы не можете произвольно предположить, что ядро ​​разрешает дампы ядра. Параметр ядра 'fs.suid_dumpable' разрешает/запрещает основные дампы. В большинстве производных RHEL 6.8+ это запрещается. Вам также необходимо найти место размещения дампа ядра. Значение по умолчанию находится в 'pwd', но его можно настроить для сброса в другом месте и с другим шаблоном имени. Это устанавливается в 'kernel.core_pattern'. – alvits

ответ

3

Предполагая, что вы НЕ ИМЕЕТ файл с именем 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

Смежные вопросы