Захват вывода команды с истекшим временем ожидания с помощью Ubuntu `timeout`

Связанные вопросы:

Этот вопрос не требует решения.

Этот вопрос имел резолюцию, не касающуюся timeout, но предложил, чтобы timeout работало для этой цели, когда она доступна.

Мой вопрос:

Эта команда не производит вывода в foo.txt:

$ cat foo.sh 
#!/bin/sh
sh -c "echo foo; sleep 5; echo bar" | awk '/foo/ {print $1}'
$ timeout 2 ./foo.sh > foo.txt

Если я не перенаправляюсь на foo.txt, я вижу, что foo распечатывается немедленно, как и ожидалось.

С другой стороны, следующее создает "foo" в файле foo.txt, как и ожидалось:

$ timeout 2 sh -c "echo foo; sleep 5; echo bar" > foo.txt
$ cat foo.txt
foo

Кто-нибудь знает, почему это может происходить и как лучше всего это решить? Это игрушечный пример, но реальный сценарий, который я запускаю, который привел к этой проблеме, выдает около 100 строк вывода в командной строке, но также оставляет foo.txt пустым, если время ожидания истекло до завершения.


person jonderry    schedule 17.11.2014    source источник


Ответы (2)


Я нашел решение для этого. Ключевым моментом является добавление fflush() внутри awk-скрипта, который, похоже, буферизует вывод:

#!/bin/sh
sh -c "echo foo; sleep 5; echo bar" | awk '/foo/ {print $1; fflush()}'
$ timeout 2 ./foo.sh > foo.txt
person jonderry    schedule 18.11.2014

По моему опыту, это потому, что труба "|" подождите "echo foo; sleep 5; echo bar" выполнение завершено. Таким образом, через 5 секунд awk может получить вывод, но тайм-аут завершает команду через 2 секунды, поэтому он не может получить текст.

Редактировать:

Может быть, это поможет, вы можете переместить char (") в конец следующим образом:

$ cat foo.sh 
#!/bin/sh
sh -c "echo foo; sleep 5; echo bar | awk '/foo/ {print $1;}'"
$ timeout 2 ./foo.sh > foo.txt
$ cat foo.txt 
foo
person tianyu    schedule 18.11.2014