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

未在Shell脚本上打印结束时间戳:使用陷阱,shell,ksh,shell-trap,Shell,Ksh,Shell Trap,我有一个用于部署的shell脚本。因为我想捕获整个流程的输出,所以我将其包装在一个子shell中,并将其结尾: #! /usr/bin/env ksh # deploy.sh ######################################################################## (yadda, yadda, yadda) #################################################################

我有一个用于部署的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"
#
########################################################################
在使用subshell之前,
trap
命令起作用。当您按下
CNTL-C
时,程序将打印
停止脚本:
和日期

但是,我想确保没有人忘记保存这个脚本的输出,所以我使用子shell自动保存输出。现在,陷阱似乎不起作用了

我做错了什么


新信息 多玩一会儿。我现在明白问题不在于外壳或子外壳。是该死的烟斗

如果我不通过管道将输出传输到
tee
,则
陷阱可以正常工作。如果通过管道将输出传输到
tee
,则
trap
不起作用

所以,真正的问题是,我如何在输出时仍然能够使用
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

顶部的一个管道连接到
somefile…
。底部的那个没有。最下面的一个,陷阱起作用了。最上面的那个,陷阱没有。看看是否可以让管道工作,并将“脚本在”行打印到T形输出文件中


这管子管用。陷阱没有,但只有当我有烟斗的时候。您可以将
trap
语句四处移动,并放入一层又一层的子shell中。我正在做的一些小事情是错误的,我不知道它是什么。

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

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

好的,现在我知道了。您必须使用tee with-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

这个很好用

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

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

好的,现在我知道了。您必须使用tee with-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

这个很好用

我记得在Shell脚本课程中,讲师说有时陷阱可能会丢失(串行端口,当时的硬件速度要慢得多),您可能需要嵌套陷阱命令。另外,您确定陷阱在子shell上工作,还是需要在子shell中“删除”陷阱。祝你好运。我记得在Shell脚本课程中,老师说有时陷阱可能会丢失(串行端口,当时的硬件速度慢得多),你可能需要嵌套陷阱命令。另外,您确定陷阱在子shell上工作,还是需要在子shell中“删除”陷阱。祝你好运,“三通”管工作正常,谢谢。我得到日志的输出。我似乎无法在控制台或日志上打印出最后一行“停止脚本”。看起来我的烟斗正在拦截信号。不,我知道了,我想,试试“T-I”;-)(见我在回答中的编辑)这就是问题所在。我需要“-I”来忽略球座上的符号。谢谢,“三通”管很好用,谢谢。我得到日志的输出。我似乎无法在控制台或日志上打印出最后一行“停止脚本”。看起来我的烟斗正在拦截信号。不,我知道了,我想,试试“T-I”;-)(见我在回答中的编辑)这就是问题所在。我需要“-I”来忽略球座上的符号。谢谢