建立單服務程序集輸出的記錄檔時出現問題

建立單服務程序集輸出的記錄檔時出現問題

當我們在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" }:但是,如果您這樣做,您實際上最好使用腳本,它更容易編寫且更易於維護。

相關內容