Конечная отметка времени не печатается в сценарии оболочки: использование ловушки - PullRequest
1 голос
/ 04 апреля 2011

У меня есть сценарий оболочки, который я использую для развертываний. Поскольку я хочу захватить вывод всего процесса, я завернул его в подоболочку и добавил:

#! /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 вокруг и помещать в слои и слои подоболочек. Есть что-то незначительное, что я делаю неправильно, и я понятия не имею, что это такое.

1 Ответ

1 голос
/ 08 апреля 2011

Поскольку trap останавливает запущенный процесс - logShell.sh - я думаю, что канал вообще не выполняется. Вы не можете сделать это таким образом.

Одним из решений может быть редактирование logShell.sh для построчной записи в файл журнала. Может быть, вы могли бы опубликовать это, и мы могли бы обсудить, как вы управляете этим.

Хорошо, теперь я понял. Вы должны использовать тройник с -i, чтобы игнорировать сигналы прерывания.

#! /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 -i somefile

этот работает отлично!

...