У меня есть сценарий оболочки, который я использую для развертываний. Поскольку я хочу захватить вывод всего процесса, я завернул его в подоболочку и добавил:
#! /usr/bin/env ksh
# deploy.sh
########################################################################
(yadda, yadda, yadda)
########################################################################
# LOGGING WRAPPER
#
dateFormat=$(date +"%Y.%m.%d-%H.%M.%S")
(
print -n "EXECUING: $0 $*: "
date
#
########################################################################
(yadda, yadda, yadda)
#
# Tail Startup
#
trap 'printf "Stopping Script: ";date;exit 0"' INT
print "TAILING LOG: YOU MAY STOP THIS WITH A CTRL-C WHEN YOU SEE THAT SERVER HAS STARTED"
sleep 2
./tailLog.sh
) 2>&1 | tee "deployment.$dateFormat.log"
#
########################################################################
До того, как я использовал подоболочку, работала команда trap
. Когда вы нажмете CNTL-C
, программа напечатает Stopping Script:
и дату.
Однако я хотел убедиться, что никто не забудет сохранить выходные данные этого сценария, поэтому я использовал подоболочку для автоматического сохранения результатов. И теперь, похоже, trap
не работает.
Что я делаю не так?
НОВАЯ ИНФОРМАЦИЯ
Еще немного поиграться. Теперь я вижу, что проблема не в оболочке или подоболочке. Это чертова труба!
Если я не перенаправлю вывод на tee
, trap
работает нормально. Если я перенаправлю вывод на tee
, trap
не будет работать.
Итак, реальный вопрос в том, как мне tee выводить и все еще иметь возможность использовать trap
?
ТЕСТОВАЯ ПРОГРАММА
Прежде чем ответить, пожалуйста, попробуйте следующие тестовые программы:
#! /bin/ksh
dateFormat=$(date +"%Y.%m.%d-%H:%M:%S")
(
trap 'printf "The script was killed at: %s\n", "$(date)"' SIGINT
echo "$0 $*"
while sleep 2
do
print -n "The time is now "
date
done
) | tee somefile
И
#! /bin/ksh
dateFormat=$(date +"%Y.%m.%d-%H:%M:%S")
(
trap 'printf "The script was killed at: %s\n", "$(date)"' SIGINT
echo "$0 $*"
while sleep 2
do
print -n "The time is now "
date
done
)
Верхняя труба к somefile....
. Нижний не делает. Нижняя ловушка работает. Лучшая ловушка - нет. Посмотрите, сможете ли вы заставить конвейер работать и строку «Сценарий был убит при» для печати в файл вывода.
Труба работает. Ловушка не, но только когда у меня есть труба. Вы можете перемещать оператор trap
вокруг и помещать в слои и слои подоболочек. Есть что-то незначительное, что я делаю неправильно, и я понятия не имею, что это такое.