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
이를 설정하면 .
잠재적으로 큰 보안 허점이 열립니다. 내가 당신이라면 정말 그렇게 하지 않을 거예요.
실제로 실행 파일에서 이 작업을 수행해야 하는 경우 두 가지 중 하나를 수행할 수 있습니다.
리디렉션표준 출력그리고표준 에러당신 자신. 여기에서 로그 파일로 이동 해야 합니다
close(1)
.open()
그러면 할 수close(2)
있습니다dup(1)
. 이후에는execve
프로그램이 출력을 다른 곳으로 리디렉션하려고 시도할 필요가 없습니다. 이미 로그 파일로 리디렉션되었기 때문입니다.명령을 해석하기 위해 셸을 호출합니다. 여기에는 세 가지 매개 변수가 필요합니다
char *argv[] = { "/bin/sh", "-c", "mono-service.exe Audio_Recorder.exe --debug >& log.txt" }
. 그러나 이렇게 하면 실제로 작성하기 쉽고 유지 관리하기 쉬운 스크립트를 사용하는 것이 더 좋습니다.