SSH分支和子节点



我有一个程序,我ssh到服务器并获取数据。这里是代码…我fork它,子进程执行查询,父进程等待子进程一段预定的时间(在函数超时中),然后杀死子进程。我做了那部分,因为有时,我不完全确定为什么,但ssh连接停止,不退出。也就是说,在进程列表中有一个"ssh -oConnectTimeout=60 blah blah"很长一段时间,超时函数似乎不起作用。我哪里做错了?上次这个问题发生时,有一个ssh在进程列表5天,仍然没有超时,程序已经停止,因为它正在等待子进程。有那些额外的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;
}

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

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

相关内容

  • 没有找到相关文章

最新更新