모노 서비스 어셈블리 출력의 로그 파일 생성 문제

모노 서비스 어셈블리 출력의 로그 파일 생성 문제

Ubuntu Linux 16.04에서 백그라운드 모드 로 시작하면 mono-service사용자가 원하는 곳에 로그 파일을 생성하여 저장하고 싶습니다. 이 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줄에 리터럴 인수로 전달됩니다. 구체적으로 >&~ 아니다쉘에서는 "부착"을 의미하는 것으로 해석됩니다.표준 오류에게표준 출력"명령줄을 처리하는 쉘이 없기 때문입니다.

프로그램이 주어진 '>&' 매개변수를 좋아하지 않아 즉시 종료될 가능성이 있습니다.

LD_LIBRARY_PATH로 설정하면 .잠재적으로 큰 보안 허점이 발생합니다. 내가 당신이라면 정말 그렇게 하지 않을 거예요.


실제로 실행 파일에서 이 작업을 수행해야 하는 경우 두 가지 중 하나를 수행할 수 있습니다.

  1. 리디렉션표준 출력그리고표준 오류당신 자신. 여기에서 로그 파일을 확인 close(1)해야 합니다 . open()그런 다음 close(2)dup(1). 그 후에는 execve출력을 어디로든 리디렉션하지 않고 프로그램만 사용하면 됩니다. 이미 로그 파일로 리디렉션되고 있기 때문입니다.

  2. 명령을 해석하려면 쉘을 호출하십시오. 여기에는 세 가지 인수가 필요합니다: char *argv[] = { "/bin/sh", "-c", "mono-service.exe Audio_Recorder.exe --debug >& log.txt" }. 그러나 이 작업을 수행하는 경우 작성하기 쉽고 유지 관리가 더 쉬운 스크립트를 사용하는 것이 좋습니다.

관련 정보