SSH fork和children

时间:2011-09-21 07:49:34

标签: ssh timeout fork

我有一个程序,我可以在服务器中获取数据。这是代码...我把它分叉,孩子执行查询,父母等待孩子一段预定的时间(在函数超时),然后杀死孩子。我做了那个部分,因为有时,我不确定为什么,但ssh连接停止并且不退出。也就是说,在进程列表中有一个“ssh -oConnectTimeout = 60 blah blah”,并且超时函数似乎不起作用。我在这做错了什么?上次出现此问题时,进程列表中有一个ssh持续5天仍然没有超时,程序已经停止,因为它正在等待孩子。还有那些额外的wait()函数,因为之前我得到了很多已经失效的进程a.k.a僵尸。所以我采取了简单的方法..

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 :(得分:0)

SIGTERM只是要求礼貌地终止该过程。如果它被卡住,那么它将不会响应,你需要使用SIGKILL来杀死它。可能在尝试SIGTERM并等待一段时间之后。

另一种可能性是它正在等待父进程的输出管道不满 - 也许有足够的输出来填充缓冲区,而且孩子正在等待而不是网络。