结束时间戳不在Shell脚本上打印:使用陷阱

时间:2011-04-04 18:31:45

标签: shell ksh shell-trap

我有一个用于部署的shell脚本。因为我想要捕获整个过程的输出,所以我将它包装在一个子shell中并将其拖尾:

#! /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"
#
########################################################################

在我使用子shell之前,trap命令有效。按下CNTL-C后,程序将打印Stopping Script:和日期。

但是,我想确保没有人忘记保存此脚本的输出,所以我使用子shell自动保存输出。而且,现在trap似乎没有起作用。

我做错了什么?


新信息

多一点玩耍。我现在看到的问题不是shell或子shell。这是该死的烟斗!

如果我没有将输出传递给teetrap工作正常。如果我将输出传输到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....。底部没有。底部,陷阱工作。最上面的一个,陷阱没有。看看你是否可以让管道工作,并且“脚本被杀死”行打印到teed out文件中。

管道确实有效。陷阱没有,但只有当我有管道时。您可以移动trap语句并放入子shell的图层和图层。我做的一些小事是错的,我不知道它是什么。

1 个答案:

答案 0 :(得分:1)

由于trap停止了正在运行的进程 - logShell.sh - 我认为管道根本没有被执行。你不能这样做。

一种解决方案是编辑logShell.sh以在日志文件中逐行编写。也许你可以发布它,我们可以讨论你如何管理它。

好的,现在我知道了。你必须使用带-i的tee来忽略中断信号。

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

这个工作正常!