
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つの方法のいずれかを実行できます。
リダイレクト標準出力そして標準エラー出力
close(1)
自分で実行します。ここで、 を実行してからログ ファイルに を実行する必要があります。その後、を実行しopen()
て を実行できます。この後は、出力をどこにもリダイレクトせずにプログラムを実行するだけです。これは、既にログ ファイルにリダイレクトされているためです。close(2)
dup(1)
execve
コマンドを解釈するためにシェルを呼び出します。ここでは 3 つの引数が必要です:
char *argv[] = { "/bin/sh", "-c", "mono-service.exe Audio_Recorder.exe --debug >& log.txt" }
。ただし、これを行う場合は、スクリプトを使用する方が簡単です。スクリプトの方が記述が簡単で、保守も容易です。