単一サービスアセンブリ出力のログファイル生成の問題

単一サービスアセンブリ出力のログファイル生成の問題

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つを実行できます。

  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" }。ただし、これは実際に作成しやすくメンテナンスしやすいスクリプトを使用する方が良いでしょう。

関連情報