
Cuando iniciamos en mono-service
modo 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.txt
se 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_PATH
en .
, 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
Redirigirsalida estándarystderrtú mismo. Aquí deberá ingresar
close(1)
y luegoopen()
acceder a su archivo de registro. Entonces puedesclose(2)
ydup(1)
. Después de esto, simplementeexecve
su programa sin intentar redirigir la salida a ninguna parte, porque ya está siendo redirigido al archivo de registro.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.