创建单服务程序集输出的日志文件时出现问题

创建单服务程序集输出的日志文件时出现问题

当我们在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.,会打开一个潜在的巨大安全漏洞。如果我是你,我真的不会这么做。


如果您确实需要从可执行文件执行此操作,那么您可以执行以下两件事之一

  1. 重定向标准输出标准错误你自己。在这里您需要close(1)然后open()到您的日志文件。然后你就可以close(2)dup(1)。之后,execve您的程序就无需尝试将输出重定向到任何地方 - 因为它已经被重定向到日志文件。

  2. 调用 shell 来解释您的命令。这里你需要三个参数char *argv[] = { "/bin/sh", "-c", "mono-service.exe Audio_Recorder.exe --debug >& log.txt" }:但是,如果您这样做,您实际上最好使用脚本,它更容易编写且更易于维护。

相关内容