тупик в процессе, команда Unix? - PullRequest
3 голосов
/ 28 ноября 2010

Я пытался выяснить, как узнать, заблокированы ли потоки процесса на компьютере с Unix / Linux?Кроме того, есть ли команда для определения того, на какой стадии (или статусе) находится процесс?Если вы знаете какие-либо инструменты, пожалуйста, предложите.Спасибо.

Ответы [ 3 ]

2 голосов
/ 30 ноября 2010

Благодаря /proc/<pid>/syscall, вот так я и реализовал быстрый и грязный процессный сканер futex (op = FUTEX_WAIT) .

#!/bin/bash
#
# Find all processes that are executing a futex(2) call with op=FUTEX_WAIT
# In some cases this can be helpful in finding deadlock-ed processes.
#

test ! $UID -eq 0 && echo -e "WARNING: Not running as root, only processes for this user are being scanned\n" >&2;
pids=$(ps -u $UID -opid --no-headers)

for pid in $pids; do
        cat /proc/$pid/syscall |

        awk "{if (\$1 == 202 && \$3 == \"0x0\") {
                print $pid
        }}";

        # $1 is the syscall, we compare to 202 which is the futex call
        # See: /usr/include/asm/unistd.h

        # $2 is the 1st param, $3 is the 2nd param, etc
        # We compare the second param to 0x0 which is FUTEX_WAIT
        # See: /usr/include/linux/futex.h
done
1 голос
/ 28 ноября 2010

Попробуйте использовать инструмент, который отслеживает системные вызовы, например, strace в Linux или tusc в HP-UX. Когда возникла тупиковая ситуация, вы должны увидеть зависание процесса в вызове блокировки. Это не является положительным доказательством. Это может быть обычный блок. Затем вам нужно определить, может ли блок быть разрешен когда-то или нет. Это требует знания ресурса, которого ожидает процесс.

Пример

На RHEL4 существует ... особенность ..., которая может привести к тупику ctime. Найдите пример программы, демонстрирующей это поведение ниже:

#include <sys/time.h>
#include <time.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

volatile char *r;

void handler(int sig)
{
    time_t t;

    time(&t);
    r = ctime(&t);
}

int main()
{
    struct itimerval it;
    struct sigaction sa;
    time_t t;
    int counter = 0;

    memset(&sa, 0, sizeof(sa));
    sa.sa_handler = handler;
    sigaction(SIGALRM, &sa, NULL);

    it.it_value.tv_sec = 0;
    it.it_value.tv_usec = 1000;
    it.it_interval.tv_sec = 0;
    it.it_interval.tv_usec = 1000;
    setitimer(ITIMER_REAL, &it, NULL);

    while(1) {
        counter++;
        time(&t);
        r = ctime(&t);
        printf("Loop %d\n",counter);
    }

    return 0;
}

Как правило, после пары тысяч итераций он заходит в тупик. Теперь прикрепите strace вот так

strace -s4096 -p<PID>

где PID - идентификатор процесса программы. Вы увидите зависание программы при вызове с FUTEX_WAIT в параметрах. (Я не могу процитировать всю строку, так как в настоящее время у меня нет доступа к машине RHEL4, извините, пожалуйста).

0 голосов
/ 28 ноября 2010

UNIX гарантирует, что процессы ОС никогда не попадут в тупик.Однако такие гарантии не предоставляются для пользовательских процессов.Насколько я знаю, не существует прямого способа определить, был ли процесс заблокирован.

Тем не менее, вы можете определить состояние процесса по ps -o pid,uname,command,state,stime,time.man ps также показывает более подробное объяснение кодов состояния процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...