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

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

Quando iniciamos o mono-servicemodo Ubuntu Linux 16.04 em segundo plano, gostaríamos de criar e armazenar um arquivo de log onde o usuário desejar. 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?

Responder1

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.txtsão passados ​​como argumentos literais para sua linha de comando. Especificamente, >&énãointerpretado pelo shell como significando "anexarstderrparasaída padrão"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 fornecido e saia imediatamente.

Definir LD_LIBRARY_PATHcomo ., abre uma falha de segurança potencialmente enorme. Eu realmente não faria isso se fosse você.


Se você realmente precisa fazer isso a partir de um executável, você pode fazer uma de duas coisas

  1. Redirecionarsaída padrãoestderrvocê mesmo. Aqui você precisará close(1)do open()seu arquivo de log. Você pode então close(2)e dup(1). Depois disso, apenas execveo seu programa sem tentar redirecionar a saída para qualquer lugar - porque ela já está sendo redirecionada 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 mais fácil de manter.

informação relacionada