2016-08-08 2 views
1

Когда ProgramA убит внешним процессом (убито: 9), я не могу перенаправить его вывод (std/stderr) или сохранить его в переменной.Bash save/redirect stdout и stderr, когда программа убита

програма:

$ ./ProgramA arg1 
    This is on stderr 
    This is on stdout 
    Killed: 9 

В противном случае для сохранения переменной:

$ ProgramA_Output=`ProgramA arg1` 
$ echo "$ProgramA_Output" 

$ 

Перенаправление в файл также не работает:

$ ProgramA arg1 > output.txt 
$ cat ./output.txt 
$ 

Любые подсказки для сохранения/перенаправления вывод?

+1

Если это убитая оболочка, вы ничего не можете сделать ** на SIGKILL. В этом весь смысл использовать его вместо SIGTERM (и, наоборот, использовать SIGTERM вместо этого, когда это возможно): он не может быть захвачен/обработан и поэтому будет немедленно завершен [запрет блокировки системных вызовов или тому подобное] , но * также * гарантированно не позволяет программе убивать себя, очищать свои выходные буферы и т. д. –

+1

Тем не менее, вы писали 'ProgramA'? Если это так, вы можете заставить его сбросить свои буферы раньше. –

+0

К сожалению, я не писал 'ProgramA', и я не уверен, что даже заставляет его убить. –

ответ

2

Скорее всего, непосредственной причиной здесь является то, что ваша программа только промывает свои буферы поэтапно, когда вывод осуществляется в 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).

Смежные вопросы