2010-04-28 159 views
4

我想在Unix的远程机器上运行程序作为守护进程。我有rsh连接,我希望程序在断开连接后运行。通过rsh运行守护进程

假设我有两个程序:util.cpp和forker.cpp。

util.cpp是一些实用工具,为了我们的目的让它成为无限根。

util.cpp

int main() { 
    while (true) {}; 
    return 0; 
} 

forker.cpp需要一些程序和在过程separe通过fork()和execve的()中运行:

forker.cpp

#include <stdio.h> 
#include <errno.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(int argc, char** argv) { 
    if (argc != 2) { 
    printf("./a.out <program_to_fork>\n"); 
    exit(1); 
    } 

    pid_t pid; 

    if ((pid = fork()) < 0) { 
    perror("fork error."); 
    exit(1); 
    } else if (!pid) { 
    // Child. 
    if (execve(argv[1], &(argv[1]), NULL) == -1) { 
     perror("execve error."); 
     exit(1); 
    } 
    } else { 
    // Parent: do nothing. 
    } 
    return 0; 
} 

如果我运行:

./forker util 

forker完成得非常快,并且bash'没有暂停',并且util作为守护程序运行。

但是,如果我运行:

scp forker remote_server://some_path/ 
scp program remote_server://some_path/ 
rsh remote_server 'cd /some_path; ./forker program' 

那么它是所有相同(即在remote_sever forker迅速完成,UTIL运行),但我在本地机器上的bash暂停。 它正在等待util停止(我检查了它,如果util.cpp返回,它就没事了),但我不明白为什么?!

有两个问题:

1) Why is it paused when I run it through rsh? 

我确信,我选择了一些愚蠢的方式来运行的守护进程。所以

2) How to run some program as daemon in C/C++ in unix-like platforms. 

Tnx!

回答

2

1)为什么它在我通过rsh运行时暂停?

当你创建一个进程,子进程都有自己的父母的文件描述符的副本。每个孩子的文件描述符引用与父对应文件描述符相同的打开文件描述。拨打fork()之后,在调用execve()之前,您并没有关闭子进程中的标准流(stdin,stdout,stderr),以便它们仍连接到rsh。只要远程服务器上的任何进程持有对这些流的引用,rsh就不会返回。在您拨打execve()之前,您可以尝试使用fclose()关闭标准流,或在执行您的forker程序(即./forker program >/dev/null 2>/dev/null </dev/null)时重定向它们。

2)如何运行一些程序作为++在类UNIX平台在C/C守护程序。

根据wikipedianohup最常用于运行在后台作为后台命令。此网站上还有几个daemon related questions可供参考。

wikipedia

nohup的是POSIX命令忽略HUP(挂起)信号,使命令,以保持谁发出命令退出的用户后运行。按照惯例,HUP(挂断)信号是终端警告取决于注销过程的方式。

如果你的程序总是作为一个守护进程运行,你可以看看你的程序中调用daemon()的可能性。便利功能在一些UNIX系统中存在。

daemon(3) man page

的守护程序()函数是用于希望从控制终端中跳出来并在后台系统守护程序运行的程序。

如果这个功能不是为你存在,或者应该有你的程序不作为守护程序运行的情况下,你的forker程序还可以被修改为“守护进程”的其他程序。


,而不会对代码进行任何更改,你可以尝试像以下:

rsh remote_server 'cd /some_path; nohup ./forker program >program.out 2>program.err </dev/null &'

+0

线轮,RSH REMOTE_HOST” ./forker方案>的/ dev/null的2>的/ dev/null Max 2010-04-28 17:30:37

+0

关于第二个问题,我认为你的意思是nohup ./program,而不是nohup ./forker程序。无论如何,nohup在程序运行之前不会返回。这就是为什么我需要沃克。如果您在服务器上执行rsh命令并在那之后写入'nohup ./program',如果关闭会话,程序仍在运行。但是,如果您尝试运行'rsh服务器'nohup ./program'',那么它又暂停了。如果你按下ctrl-c,程序正在停止。无论如何,我对第一个问题感兴趣。 – Max 2010-04-28 17:39:17

+0

' jschmier 2010-04-28 17:42:26