단일 서비스 어셈블리 출력에 대한 로그 파일 생성 문제

단일 서비스 어셈블리 출력에 대한 로그 파일 생성 문제

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" }. 그러나 이렇게 하면 실제로 작성하기 쉽고 유지 관리하기 쉬운 스크립트를 사용하는 것이 더 좋습니다.

관련 정보