Problemas al crear un archivo de registro de la salida del ensamblado monoservicio

Problemas al crear un archivo de registro de la salida del ensamblado monoservicio

Cuando iniciamos en mono-servicemodo Ubuntu Linux 16.04 en segundo plano, nos gustaría crear y almacenar un archivo de registro donde el usuario desee. Probé esta URL, stackoverflow.com/questions/11024474/capture-mono-service-stdout-console-output

donde dice haz esto:

mono-service2 myservice.exe -l:/var/run/test --debug > log.txt

que no funciona cuando pruebo el siguiente programa 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;

}

porque observo que no se crea ningún archivo de registro. ¿Cómo podría solucionar este error?

Respuesta1

El programa C realiza el equivalente de este script:

#!/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

Observe que >&y LOGCamster.txtse pasan como argumentos literales a su línea de comando. Específicamente, >&esnointerpretado por el shell como "adjuntarstderrasalida estándar" porque no hay ningún shell que maneje su línea de comando.

Lo más probable es que al programa no le guste el parámetro '>&' que se le está asignando y salga inmediatamente.

Configurarlo LD_LIBRARY_PATHen ., abre un agujero de seguridad potencialmente enorme. Realmente no haría eso si fuera tú.


Si realmente necesita hacer esto desde un ejecutable, puede hacer una de dos cosas

  1. Redirigirsalida estándarystderrtú mismo. Aquí deberá ingresar close(1)y luego open()acceder a su archivo de registro. Entonces puedes close(2)y dup(1). Después de esto, simplemente execvesu programa sin intentar redirigir la salida a ninguna parte, porque ya está siendo redirigido al archivo de registro.

  2. Llame a un shell para interpretar su comando. Aquí necesitas tres argumentos: char *argv[] = { "/bin/sh", "-c", "mono-service.exe Audio_Recorder.exe --debug >& log.txt" }. Sin embargo, si está haciendo esto, también podría utilizar un script, que es más fácil de escribir y más fácil de mantener.

información relacionada