Problemas ao criar o arquivo de log da saída de montagem de mono-serviço

0

Quando começarmos no modo mono-service no Ubuntu Linux 16.04 em segundo plano, gostaríamos de criar e armazenar um arquivo de log onde quer que o usuário queira. Eu tentei este URL stackoverflow.com/questions/11024474/capture-mono-service-stdout-console-output

onde diz: faça isso:

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

que não funciona quando testo o seguinte 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 não observo nenhum arquivo de log sendo criado. Como eu poderia corrigir esse erro?

    
por Frank 17.05.2016 / 13:39

1 resposta

1

O programa C executa o equivalente a 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 >& e LOGCamster.txt são passados como argumentos literais para sua linha de comando. Especificamente, >& é não interpretado pelo shell para significar "attach stderr para stdout " porque não há nenhum shell manipulando sua linha de comando.

As chances são de que o programa não goste do "> &" parâmetro que está sendo dado e sai imediatamente.

A definição de LD_LIBRARY_PATH para . abre um buraco de segurança potencialmente enorme. Eu realmente não faria isso se fosse você.

Se você realmente precisa fazer isso de um executável, então você pode fazer uma das duas coisas

  1. Redirecione stdout e stderr você mesmo. Aqui você precisará close(1) e open() em seu arquivo de log. Você pode então close(2) e dup(1) . Depois disso, apenas execve do seu programa sem tentar redirecionar a saída para qualquer lugar - porque ele já está sendo redirecionado para o arquivo de log.

  2. Chame um shell para interpretar seu comando. Aqui você precisa de três argumentos: char *argv[] = { "/bin/sh", "-c", "mono-service.exe Audio_Recorder.exe --debug >& log.txt" } . No entanto, se você estiver fazendo isso, é melhor usar um script, que é mais fácil de escrever e manter.

por 17.05.2016 / 14:07