2010-04-28 213 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