
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" }
. 그러나 이 작업을 수행하는 경우 작성하기 쉽고 유지 관리가 더 쉬운 스크립트를 사용하는 것이 좋습니다.