在mono-service
后台在Ubuntu Linux 16.04上以该模式启动时,我们想在用户想要的任何位置创建和存储日志文件。我尝试了这个URL,stackoverflow.com/questions/11024474/capture-mono-service-stdout-console-output
它说的做到这一点:
mono-service2 myservice.exe -l:/var/run/test --debug > log.txt
当我测试以下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;
}
因为我观察到没有日志文件被创建。我该如何解决此错误?
C程序执行与以下脚本等效的操作:
#!/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
注意,>&
和LOGCamster.txt
作为文字参数传递给命令行。具体而言,>&
是不是由shell解释为“附加标准错误到标准输出”,因为没有外壳处理您的命令行。
程序可能不喜欢给出的'>&'参数,并立即退出。
设置LD_LIBRARY_PATH
为.
,会打开一个潜在的巨大安全漏洞。如果我是你,我真的不会那样做。
如果您确实需要通过可执行文件执行此操作,则可以执行以下两项操作之一
重定向stdout和stderr自己。在这里,您将需要close(1)
,然后open()
到你的日志文件。然后close(2)
,您可以和dup(1)
。之后,只需执行execve
您的程序即可,而无需尝试将输出重定向到任何地方-因为它已经被重定向到日志文件。
调用外壳程序来解释您的命令。在这里,你需要三个参数:char *argv[] = { "/bin/sh", "-c", "mono-service.exe Audio_Recorder.exe --debug >& log.txt" }
。但是,如果要执行此操作,则实际上还可以使用脚本,该脚本更易于编写且更易于维护。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句