
Когда мы запускаем 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
на .
, открывает потенциально огромную дыру в безопасности. Я бы действительно не делал этого, если бы я был вами.
Если вам действительно нужно сделать это из исполняемого файла, то вы можете сделать одно из двух:
Перенаправитьстандартный выводиstderrсебя. Здесь вам нужно
close(1)
и затемopen()
в ваш файл журнала. Затем вы можетеclose(2)
иdup(1)
. После этого простоexecve
ваша программа, не пытаясь перенаправить вывод куда-либо - потому что он уже перенаправляется в файл журнала.Вызовите оболочку для интерпретации вашей команды. Здесь вам нужно три аргумента:
char *argv[] = { "/bin/sh", "-c", "mono-service.exe Audio_Recorder.exe --debug >& log.txt" }
. Однако, если вы делаете это, вы действительно можете использовать скрипт, который проще написать и более удобен в обслуживании.