#go #exec #binaryfiles
#Вперед #exec #двоичные файлы
Вопрос:
У меня есть двоичный файл, который зацикливается вечно, возвращая вывод каждую миллисекунду (страшно, я знаю). Я бы хотел вызвать его через Go. Проблема в том, (насколько я вижу и понимаю), Go будет ждать завершения команды, прежде чем показывать вывод. В моем случае команда не будет завершена, пока не будет уничтожена (я также хотел бы остановить двоичный файл, остановив программу Go). Вот что у меня получилось:
func main(){
loggerInit := exec.Command("/logger")
var out Bytes.Buffer
loggerInit.Stdout = amp;out
err = loggerInit.Run()
if err != nil {
fmt.Println(err)
}
fmt.Printf(out.String())
}
Но это не приводит к выводу и остается в команде навсегда (в то время как фактический запуск /logger
вручную дает желаемый результат). Спасибо и приветствия!
Комментарии:
1. Назначьте ОС. Стандартный вывод в loggerInit. Стандартный вывод, а не буфер.
Ответ №1:
Вы используете Run
:
Run запускает указанную команду и ожидает ее завершения.
Где, исходя из вашего описания, вы должны использовать Start
:
Start запускает указанную команду, но не ждет ее завершения.
Но, конечно, вам нужно настроить свой код на ожидание или цикл или что-то в этом роде, иначе ваше приложение просто завершит работу сразу после первого чтения любого вывода.
Комментарии:
1. Я пришел к тому же выводу, но использование Start только что завершило программу. Я обязательно попробую немного подождать в конце!
Ответ №2:
Я думаю, что вы можете передать вывод logger с помощью Go, используя эту команду
./logger | main.go
Это означает, что регистратор выдает что-то (например, байты / строку) и считывает этот вывод в качестве входных данных.
main.go
buf := make([]byte, expectedBytes)
for {
bytes, _ := io.ReadFull(os.Stdin, buf)
// do it here
time.Sleep(1 * time.Second)
}
Извините за мой английский и надеюсь, что это поможет.
Комментарии:
1. Спасибо за информацию, и ваш английский в порядке! В
// do it here
, какие точные команды я должен разместить? Не уверен, как он должен обрабатывать стандартный вывод, поэтому интересно ;))2. Вы можете распечатать вывод регистратора следующим образом
fmt.Println(string(bytes))