
Quando iniciamos o mono-service
modo 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.txt
sã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_PATH
como .
, 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
Redirecionarsaída padrãoestderrvocê mesmo. Aqui você precisará
close(1)
doopen()
seu arquivo de log. Você pode entãoclose(2)
edup(1)
. Depois disso, apenasexecve
o seu programa sem tentar redirecionar a saída para qualquer lugar - porque ela já está sendo redirecionada para o arquivo de log.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.