当我们在mono-service
后台启动 Ubuntu Linux 16.04 的模式时,我们希望在用户想要的任何位置创建并存储日志文件。我尝试了这个网址,
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;
}
因为我观察到没有创建日志文件。我该如何修复这个错误?
答案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 将其解释为“附加标准错误到标准输出“因为没有 shell 处理你的命令行。
程序很可能不喜欢它所给出的“>&”参数并立即退出。
设置LD_LIBRARY_PATH
为.
,会打开一个潜在的巨大安全漏洞。如果我是你,我真的不会这么做。
如果您确实需要从可执行文件执行此操作,那么您可以执行以下两件事之一
重定向标准输出和标准错误你自己。在这里您需要
close(1)
然后open()
到您的日志文件。然后你就可以close(2)
和dup(1)
。之后,execve
您的程序就无需尝试将输出重定向到任何地方 - 因为它已经被重定向到日志文件。调用 shell 来解释您的命令。这里你需要三个参数
char *argv[] = { "/bin/sh", "-c", "mono-service.exe Audio_Recorder.exe --debug >& log.txt" }
:但是,如果您这样做,您实际上最好使用脚本,它更容易编写且更易于维护。