Probleme beim Erstellen der Protokolldatei der Monoservice-Assembly-Ausgabe

Probleme beim Erstellen der Protokolldatei der Monoservice-Assembly-Ausgabe

Wenn wir den mono-serviceModus 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.txtals 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_PATHauf .ö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

  1. UmleitenstdoutUndstderrselbst. Hier müssen Sie close(1)und dann open()zu Ihrer Protokolldatei. Sie können dann close(2)und dup(1). Danach einfach execveIhr Programm, ohne zu versuchen, die Ausgabe irgendwohin umzuleiten – weil sie bereits zur Protokolldatei umgeleitet wird.

  2. 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.

verwandte Informationen