Как вы можете перенаправить вывод скрипта через процесс? - PullRequest
4 голосов
/ 08 октября 2010

Я хочу перенаправить вывод bash-скрипта через программу регистрации.В частности, утилита Apro logrotate.Перенаправление должно быть установлено внутри самого скрипта.

Если бы перенаправление было выполнено в командной строке во время выполнения скрипта, это выглядело бы так:

myscript | logrotate -l $LOGFILE.%F 86400 2>&1

Вот некоторыепсевдокод, который идет внутри скрипта для выполнения перенаправления вывода, что не работает:

exec >(logrotate -l $LOGFILE.log.%F 86400) 2>&1

Ответы [ 4 ]

4 голосов
/ 09 октября 2010

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

PIPE=/var/run/myscript/pipe
mkfifo "$PIPE"
logrotate -l "$LOGFILE.%F" 86400 < "$PIPE" &
exec > "$PIPE"

Кроме того, что касается перенаправления 2> & 1 - убедитесь, что вы понимаете, к чему оно применяется. В вашем первом примере он применяется к logrotate, а во втором «примере» он будет применяться к вашему сценарию.

3 голосов
/ 11 ноября 2010

Это то, что вам нужно:

exec  >  >(logrotate -l $LOGFILE.log.%F 86400)

Пожалуйста, см. «Процесс подстановки» в руководстве по Bash.

Обратите внимание, что подстановка процесса не является стандартной.Откат именуется трубы.

0 голосов
/ 11 ноября 2010

Классический способ сделать это - в оболочке Bourne начиная с Unix 7th Edition - это:

{
...body of script here...
} | logrotate ...

Если вы хотите перенаправить ошибки, то:

{
...body of script here...
} 2>&1 | logrotate ...

Единственным недостатком этого обозначения является (часто довольно широкое) разделение между началом перенаправления и его окончанием.С этой точки зрения замена процесса Bash, вероятно, лучше, если вы уверены, что Bash будет доступен во всех соответствующих системах.

0 голосов
/ 08 октября 2010

Я не думаю, что скрипт может перенаправить свой собственный вывод. Можете ли вы написать скрипт-обёртку для этого?

MyScript:

myscript.real "$@" | logrotate -l $LOGFILE.%F 86400 2>&1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...