我有一个用于部署的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。这是该死的烟斗!
如果我没有将输出传递给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....
。底部没有。底部,陷阱工作。最上面的一个,陷阱没有。看看你是否可以让管道工作,并且“脚本被杀死”行打印到teed out文件中。
管道确实有效。陷阱没有,但只有当我有管道时。您可以移动trap
语句并放入子shell的图层和图层。我做的一些小事是错的,我不知道它是什么。
答案 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
这个工作正常!