По умолчанию сердечная программа выдает SIGKILL
, чтобы убить не отвечающую виртуальную машину, чтобы она могла быстро запустить новую.Это делает получение любой полезной информации о виртуальной машине практически невозможным.Что-то, что я пробовал в прошлом, - это исправление сердечной программы, чтобы избежать жесткого уничтожения, и вместо этого заставить виртуальную машину создать аварийный дамп и coredump.Я использовал такой патч (этот для Erlang / OTP R14B02):
--- erts/etc/common/heart.c.orig 2011-04-17 12:11:24.000000000 -0400
+++ erts/etc/common/heart.c 2011-04-17 12:12:36.000000000 -0400
@@ -559,10 +559,11 @@
int res;
if(heart_beat_kill_pid != 0){
pid = (pid_t) heart_beat_kill_pid;
- res = kill(pid,SIGKILL);
+ res = kill(pid,SIGUSR1);
+ sleep(4);
for(i=0; i < 5 && res == 0; ++i){
sleep(1);
- res = kill(pid,SIGKILL);
+ res = kill(pid,i < 2 ? SIGQUIT : SIGKILL);
}
if(errno != ESRCH){
print_error("Unable to kill old process, "
Как вы можете видеть, с этим патчем сердце сначала выдаст SIGUSR1
, чтобы попытаться заставить ВМ создатьаварийная свалка.Так как это может занять некоторое время, сердце спит 4 секунды.Возможно, вам придется увеличить время сна, если вы не получаете полных аварийных дампов.После этого heart дважды пытается выдать SIGQUIT
в надежде получить coredump, а в случае неудачи выдает SIGKILL
.
. Обратите внимание, что этот патч замедлит перезапуск виртуальной машины сердца из-завремя ожидания аварийных дампов и coredumps.Если вы используете его в производстве, помните об этом ограничении.