Скорее всего, непосредственной причиной здесь является то, что ваша программа только промывает свои буферы поэтапно, когда вывод осуществляется в TTY; следовательно, при перенаправлении на файл или в FIFO он еще не покраснел, когда SIGKILL был доставлен - и поскольку SIGKILL не может быть захвачен или задержан, у него нет возможности выполнить флеш в это время.
Если вы на платформе GNU, вы можете использовать stdbuf
, чтобы изменить это поведение по умолчанию:
stdbuf -o0 ./ProgramA arg1 >output.txt
... или ...
output=$(stdbuf -o0 ./ProgramA arg1)
Поскольку вы знаете, что это сбрасывается при выходе на tty (поскольку вывод отображается сразу же при запуске без перенаправления), вы также можете использовать unbuffer
(инструмент, который поставляется с expect
) для имитации этого эффекта:
output=$(unbuffer ./ProgramA arg1)
Однако самое надежное, что нужно сделать, чтобы изменить источник ProgramA
явно выполнить операцию промывки после каждой записи вы хотите, чтобы убедиться, является полным - и использовать только SIGKILL когда абсолютно необходимо. (Общей практикой является использование SIGTERM, ожидание значительного периода времени и только затем переход к SIGKILL).
Если это убитая оболочка, вы ничего не можете сделать ** на SIGKILL. В этом весь смысл использовать его вместо SIGTERM (и, наоборот, использовать SIGTERM вместо этого, когда это возможно): он не может быть захвачен/обработан и поэтому будет немедленно завершен [запрет блокировки системных вызовов или тому подобное] , но * также * гарантированно не позволяет программе убивать себя, очищать свои выходные буферы и т. д. –
Тем не менее, вы писали 'ProgramA'? Если это так, вы можете заставить его сбросить свои буферы раньше. –
К сожалению, я не писал 'ProgramA', и я не уверен, что даже заставляет его убить. –