モノサービスアセンブリ出力のログファイルの作成中に問題が発生しました

モノサービスアセンブリ出力のログファイルの作成中に問題が発生しました

Ubuntu Linux 16.04のバックグラウンドモードで起動するとmono-service、ユーザーが望む場所にログファイルを作成して保存したいと思います。このURLを試しました。 stackoverflow.com/questions/11024474/capture-mono-service-stdout-console-output

ここで次のようにします:

mono-service2 myservice.exe -l:/var/run/test --debug > log.txt

次の C++ プログラムをテストすると動作しません。

#include <unistd.h>     // execv(), fork()
#include <sys/types.h>  // pid_t
#include <sys/wait.h>   // waitpid()
#include <stdio.h>

int main(int argc, char* argvp)
{
   char *argv[] = { "/usr/lib/mono/4.5/mono-service.exe", 
                    "SmartCamXi_NVR_Recorder.exe", "--debug", "'>&'","/home/venkat/LOGCamster.txt", 0};


    char *envp[] =
    {
        "LD_LIBRARY_PATH=/home/venkat/Debug",
        0
    };
    execve(argv[0], &argv[0], envp);
    fprintf(stderr, "Oops!\n");
    return -1;

}

ログ ファイルが作成されていないことが確認されたためです。このエラーを修正するにはどうすればよいでしょうか?

答え1

C プログラムは、次のスクリプトと同等の処理を実行します。

#!/bin/bash
export LD_LIBRARY_PATH=.
exec /usr/lib/mono/4.5/mono-service.exe Audio_Video_Recorder.exe --debug '>&' LOGCamster.txt
echo "Oops!" >&2
exit 255

>&と はLOGCamster.txtコマンドラインにリテラル引数として渡されることに注意してください。具体的に>&は、ないシェルによって「接続」を意味すると解釈される標準エラー出力標準出力コマンドラインを処理するシェルがないためです。

プログラムは、与えられた '>&' パラメータを気に入らず、すぐに終了する可能性があります。

LD_LIBRARY_PATHに設定すると.、潜在的に大きなセキュリティホールが開きます。私なら絶対にそんなことはしません。


本当に実行ファイルからこれを行う必要がある場合は、次の2つの方法のいずれかを実行できます。

  1. リダイレクト標準出力そして標準エラー出力close(1)自分で実行します。ここで、 を実行してからログ ファイルに を実行する必要があります。その後、を実行しopen()て を実行できます。この後は、出力をどこにもリダイレクトせずにプログラムを実行するだけです。これは、既にログ ファイルにリダイレクトされているためです。close(2)dup(1)execve

  2. コマンドを解釈するためにシェルを呼び出します。ここでは 3 つの引数が必要です: char *argv[] = { "/bin/sh", "-c", "mono-service.exe Audio_Recorder.exe --debug >& log.txt" }。ただし、これを行う場合は、スクリプトを使用する方が簡単です。スクリプトの方が記述が簡単で、保守も容易です。

関連情報