Проблемы с созданием файла журнала вывода сборки моносервиса

Проблемы с созданием файла журнала вывода сборки моносервиса

Когда мы запускаем 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;

}

потому что я наблюдаю, что файл журнала не создается. Как я могу исправить эту ошибку?

решение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передаются как буквальные аргументы в вашу командную строку. В частности, >&isнетинтерпретируется оболочкой как «прикрепить»stderrкстандартный вывод" потому что нет оболочки, обрабатывающей вашу командную строку.

Скорее всего, программе не нравится переданный ей параметр '>&', и она немедленно завершает работу.

Установка LD_LIBRARY_PATHна ., открывает потенциально огромную дыру в безопасности. Я бы действительно не делал этого, если бы я был вами.


Если вам действительно нужно сделать это из исполняемого файла, то вы можете сделать одно из двух:

  1. Перенаправитьстандартный выводиstderrсебя. Здесь вам нужно close(1)и затем open()в ваш файл журнала. Затем вы можете close(2)и dup(1). После этого просто execveваша программа, не пытаясь перенаправить вывод куда-либо - потому что он уже перенаправляется в файл журнала.

  2. Вызовите оболочку для интерпретации вашей команды. Здесь вам нужно три аргумента: char *argv[] = { "/bin/sh", "-c", "mono-service.exe Audio_Recorder.exe --debug >& log.txt" }. Однако, если вы делаете это, вы действительно можете использовать скрипт, который проще написать и более удобен в обслуживании.

Связанный контент