4

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

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

util.cpp 是一些实用程序,为了我们的目的,让它只是无限根。

实用程序.cpp

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

forker.cpp 获取一些程序并通过 fork() 和 execve() 在单独的进程中运行它:

叉子.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.

天呐!

4

1 回答 1

2

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

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

2) 如何在类 unix 平台上以 C/C++ 的守护进程运行某些程序。

根据wikipedianohup最常用于在后台运行命令作为守护进程。此站点上还有几个与守护进程相关的问题,您可以参考以获取信息。

来自维基百科

nohup 是一个忽略 HUP(挂起)信号的 POSIX 命令,使命令在发出命令的用户注销后继续运行。HUP(挂断)信号按照惯例是终端根据注销进程发出警告的方式。

如果您的程序将始终作为守护程序运行,您可以研究daemon()从程序内部调用的可能性。daemon()便利功能存在于某些 UNIX 系统中。

daemon(3) 手册页

daemon() 函数适用于希望将自身与控制终端分离并作为系统守护进程在后台运行的程序。

如果您不存在此功能,或者您的程序不作为守护程序运行,您的分叉程序也可以修改为“守护”您的其他程序。


在不对代码进行任何更改的情况下,您可以尝试以下操作:

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

于 2010-04-28T16:37:27.280 回答