LINUX.ORG.RU

как перехватить вызов fork ?


0

0

Ситуация:
Есть набор программ - чёрных ящиков, крутящихся на сервере.
Раз в N месяцев ( N ~ 3-6 ) сервер виснет намертво.
Есть предположение, что вешает сервер одна из этих программ.
По косвенным признакам похоже, что у системы кончаются PIDы.

Чтобы доказать, что это именно так ( или опровергнуть ) хочется видеть динамику выдачи PIDов данным программам ( т. е. динамику вызовов forkов )

Как можно фиксировать в режиме реального времени ( т. е. не скриптом ps -aux под cronом :) ) факт выдачи PID конкретной программе ( факт вызова fork ) ?

Единственное что пока пришло в голову, это вот так:
xlib.c:

...
extern pid_t fork(void)
{
pid_t x;
x = syscall(SYS_fork);
printf("++++++ %d ++++++\n", (int) x);
....
здесь скорее всего dPID/dt анализироваться будет :)
....
return x;
}

ну и потом LD_PRELOAD=./xlib.so ./black_box

Какие ещё есть варианты или как этот усовершенствовать ( или исправить :) )?

Работать контрукция должна несколько месяцев и не требовать вмешательства человека.


А strace/ltrace тебе не поможет?

Сама идея про нехватку PIDов крайне странная. Если ты имеешь ввиду, что не удается запустить процесс, то это может происходить по очень разным причинам. Возможно, есть смысл прочитать про ulimit.

anonymous
()

"( т. е. не скриптом ps -aux под cronом :) )" - почему?

там лучше видно будет кто всё скушал :]

sf ★★★
()
Ответ на: комментарий от sf

если медленно что-то утекает, тогда да. А если быстро? Раз в секунду что-ли запускать :)

strace/ltrace пробовал, но оно очень медленно работает почему-то :(

В итоге вот так сделал:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

#define __USE_GNU
#include <dlfcn.h>

static void init (void) __attribute__ ((constructor));
static ssize_t (*old_fork)() = 0;

static void init (void)
{
old_fork= (ssize_t (*)()) dlsym(RTLD_NEXT, "fork");
if (old_fork== NULL)
{
fprintf(stderr, "dlsym: %s\n", dlerror());
exit(1);
}
}

pid_t fork(void)
{
pid_t x;
x = old_fork();
printf("++++++ %d ++++++\n", (int) x);
return x;
}


Вроде даже работает :)
Первый вариант с syscall не совсем правильный и не универсальный.
Также буду выдачу сокетов, выделение/освобождение памяти отслеживать.

ksicom
() автор топика
Ответ на: комментарий от ksicom

Да, странно это предположение, что кончаются ПИД-ы. Если бы это было так, то fork просто обломился бы, и сложно представить, как из-за этой, вполне явной фатальности, машина может повиснуть намертво.

Я видел такие мёртвые висюки, когда программулина со страшной силой агрессивно зажирала память. Тогда действительно просто ничего нельзя было сделать, даже реакции на клавиши не было.

Потом, такое бывает, конечно, из-за проблем в железе.

Кстати, а что-нибудь полезное пишется в /var/log/messages?

jek_
()

'strace' определенно должен помочь.

giga
()
Ответ на: комментарий от jek_

а в таких случаях pam + preemtion не спасают разве?

eXOR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.