Выполнить команду дождитесь ее завершения, отправив оперативный вывод в Go

#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))