
Wenn wir den mono-service
Modus unter Ubuntu Linux 16.04 im Hintergrund starten, möchten wir eine Protokolldatei erstellen und dort speichern, wo der Benutzer sie möchte. Ich habe diese URL ausprobiert:
stackoverflow.com/questions/11024474/capture-mono-service-stdout-console-output
wo steht: Mach Folgendes:
mono-service2 myservice.exe -l:/var/run/test --debug > log.txt
was nicht funktioniert, wenn ich das folgende C++-Programm teste:
#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;
}
weil ich beobachte, dass keine Protokolldatei erstellt wird. Wie kann ich diesen Fehler beheben?
Antwort1
Das C-Programm führt das Äquivalent dieses Skripts aus:
#!/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
Beachten Sie, dass >&
und LOGCamster.txt
als wörtliche Argumente an Ihre Befehlszeile übergeben werden. Insbesondere >&
istnichtvon der Shell als "anhängen" interpretiertstderrZustdout", weil keine Shell Ihre Befehlszeile verarbeitet.
Es besteht die Möglichkeit, dass dem Programm der übergebene „>&“-Parameter nicht gefällt und es sofort beendet wird.
Die Einstellung LD_LIBRARY_PATH
auf .
öffnet eine potenziell große Sicherheitslücke. Ich würde das an deiner Stelle wirklich nicht tun.
Wenn Sie dies wirklich von einer ausführbaren Datei aus tun müssen, können Sie eines von zwei Dingen tun
UmleitenstdoutUndstderrselbst. Hier müssen Sie
close(1)
und dannopen()
zu Ihrer Protokolldatei. Sie können dannclose(2)
unddup(1)
. Danach einfachexecve
Ihr Programm, ohne zu versuchen, die Ausgabe irgendwohin umzuleiten – weil sie bereits zur Protokolldatei umgeleitet wird.Rufen Sie eine Shell auf, um Ihren Befehl zu interpretieren. Hierfür benötigen Sie drei Argumente:
char *argv[] = { "/bin/sh", "-c", "mono-service.exe Audio_Recorder.exe --debug >& log.txt" }
. Wenn Sie dies tun, können Sie jedoch genauso gut ein Skript verwenden, das einfacher zu schreiben und zu warten ist.