SSH вилка и дети - PullRequest
       22

SSH вилка и дети

0 голосов
/ 21 сентября 2011

У меня есть программа, где я ssh на сервер и получает данные. Вот код ... Я его разветвляю, и потомок выполняет запрос, и родитель ждет потомка в течение заранее определенного промежутка времени (в функции timeout), а затем убивает потомка. Я сделал эту часть, потому что иногда я не совсем уверен, почему, но соединение ssh останавливается и не завершается. То есть в списке процессов долгое время есть «ssh -oConnectTimeout = 60 бла-бла», и функция тайм-аута, похоже, не работает. Что я здесь не так делаю? В прошлый раз, когда возникла эта проблема, в течение 5 дней в списке процессов был ssh, но время ожидания не истекло, и программа остановилась, поскольку ожидала ребенка. Есть те дополнительные функции wait (), потому что раньше я получал много несуществующих процессов, например, зомби. Так что я выбрал легкий путь ..

c = fork();
if(c==0) {
    close(fd[READ]);

    if (dup2(fd[WRITE],STDOUT_FILENO) != -1)
        execlp("ssh", "ssh -oConnectTimeout=60", serverDetails.c_str(), NULL);
    _exit(1);

}else{
    if(timeout(c) == 1){
        kill(c,SIGTERM);
        waitpid(c, &exitStatus, WNOHANG);
        wait(&exitStatus);
        return 0;
    }
    wait(&exitStatus);
}

Это функция тайм-аута.

int timeout(int childPID)
{
int times = 0, max_times = 10, status, rc;
while (times < max_times){
    sleep(5);
    rc = waitpid(childPID, &status, WNOHANG);
    if(rc < 0){
        perror("waitpid");
        exit(1);
    }
    if(WIFEXITED(status) || WIFSIGNALED(status)){
        /* child exits */
        break;
    }
    times++;
}

if (times >= max_times){
    return 1;
}
else return 0;
}

1 Ответ

0 голосов
/ 21 сентября 2011

SIGTERM просто просит вежливого завершения процесса.Если он застрял, он не будет реагировать на это, и вам нужно будет использовать SIGKILL, чтобы убить его.Вероятно, после попытки SIGTERM и небольшого ожидания.

Другая возможность состоит в том, что он ожидает, что выходной канал к родительскому процессу не будет заполнен - ​​возможно, есть достаточно вывода, чтобы заполнить буфер, и ребенок ждетна этом, а не в сети.

...