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
プログラムは出力を別の場所にリダイレクトしようとする必要はありません。すでにログファイルにリダイレクトされているからです。コマンドを解釈するためにシェルを呼び出します。これには3つのパラメータが必要です
char *argv[] = { "/bin/sh", "-c", "mono-service.exe Audio_Recorder.exe --debug >& log.txt" }
。ただし、これは実際に作成しやすくメンテナンスしやすいスクリプトを使用する方が良いでしょう。