4

Unixのリモートマシンでデーモンとしてプログラムを実行したい。rsh接続があり、切断後にプログラムを実行したい。

util.cppとforker.cppの2つのプログラムがあるとします。

util.cppはいくつかのユーティリティです。私たちの目的のために、それを単なる無限のルートにします。

util.cpp

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

forker.cppはいくつかのプログラムを取り、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フォーカーがすぐに終了し、utilが実行されています)が、ローカルマシンでのbashは一時停止しています。utilが停止するのを待っています(チェックしました。util.cppが正常よりも戻ってきた場合)が、理由がわかりません。

2つの質問があります:

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!

4

1 に答える 1

2

1)rshを実行すると、なぜ一時停止するのですか?

プロセスをフォークすると、子プロセスには親のファイル記述子の独自のコピーがあります。子の各ファイル記述子は、親の対応するファイル記述子と同じ開いているファイルの説明を参照します。呼び出した後、呼び出し前の子プロセスで標準ストリーム(、、)を閉じfork()ていないstdinため、それらは引き続きrshに接続されています。リモートサーバー上のプロセスがこれらのストリームへの参照を保持している限り、rshが返されない場合があります。呼び出しの前に標準ストリームを閉じたり、フォーカープログラムの実行時にリダイレクトしたりすることができます(つまり)。stdoutstderrexecve()fclose()execve()./forker program >/dev/null 2>/dev/null </dev/null

2)UNIXライクなプラットフォームのC /C++でデーモンとしてプログラムを実行する方法。

ウィキペディアによるとnohup、デーモンとしてバックグラウンドでコマンドを実行するために最も頻繁に使用されます。このサイトには、デーモンに関連するいくつかの質問もあり、情報を参照できます。

ウィキペディアから:

nohupは、HUP(ハングアップ)信号を無視するPOSIXコマンドであり、コマンドを発行したユーザーがログアウトした後もコマンドを実行し続けることができます。HUP(ハングアップ)信号は、慣例により、ログアウトのプロセスに応じて端末が警告する方法です。

プログラムが常にデーモンとして実行される場合は、プログラムdaemon()内から呼び出す可能性を調べることができます。便利な機能は、一部のdaemon()UNIXシステムにあります。

デーモン(3)のマニュアルページから:

daemon()関数は、制御端末から自分自身を切り離し、システムデーモンとしてバックグラウンドで実行したいプログラム用です。

この関数が存在しない場合、またはプログラムがデーモンとして実行されない場合は、フォーカープログラムを変更して他のプログラムを「デーモン化」することもできます。


コードに変更を加えることなく、次のようなことを試すことができます。

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

于 2010-04-28T16:37:27.280 に答える