1

デプロイメントに使用するシェルスクリプトがあります。プロセス全体の出力をキャプチャしたいので、それをサブシェルでラップし、それをテールアウトしました。

#! /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機能しません。

それで、本当の問題は、どのように出力をティーし、それでも使用できる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
)

上の1つはにパイプしsomefile....ます。一番下のものはそうではありません。一番下のトラップは機能します。一番上のもの、トラップはしません。パイプを機能させ、「スクリプトが強制終了されました」という行を使用して、ティードアウトファイルに出力できるかどうかを確認します。

パイプは機能します。トラップはありませんが、私がパイプを持っているときだけです。ステートメントをあちこちに移動して、trapサブシェルのレイヤーとレイヤーに配置できます。私がやっていることは間違っていることがいくつかあり、それが何であるかわかりません。

4

1 に答える 1

1

トラップが実行中のプロセス(logShell.sh)を停止するため、パイプはまったく実行されないと思います。あなたはそれをこのようにすることはできません。

1つの解決策は、logShell.shを編集して、ログファイルに1行ずつ書き込むことです。たぶんあなたはそれを投稿することができ、私たちはあなたがそれをどのように管理するかについて話し合うことができます。

OK、今私はそれを持っています。割り込み信号を無視するには、-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

これは問題なく動作します!

于 2011-04-08T11:10:03.093 に答える