1

これはうまくいきます:

$./tailx.sh error.log 10.21.xxx.xxx # /tmp/.log.pipe is removed

ただし、次のように実行しても /tmp/.log.pipe は削除されません。

$source tailx.sh
$tailx error.log 10.21.xxx.xxx # /tmp/.log.pipe is not removed 

理由と方法を知りたいですか?

これが私のコードです。リモートマシンのログを追跡するために使用します。

#!/bin/bash
# tailx error.log hostname
function tailx {

  [ $# -lt 2 ] && echo "Invalid input" && return
  # do clean,
  local LOG_PIPE=/tmp/.log.pipe
  local LOG_FILE=$1
  trap 'echo Exting..... >&2 && [ -e $LOG_PIPE ] && rm $LOG_PIPE ' EXIT
  # fix path
  [ / != ${LOG_FILE:0:1} ] && LOG_FILE=`pwd`"/"$LOG_FILE

  [ -e $LOG_PIPE ] || mkfifo $LOG_PIPE

  # iterate host, tail log
  shift
  until [ $# -eq 0 ]
  do
    ssh $1 "tail -f $LOG_FILE | awk 'BEGIN{\"hostname\"|getline HOST; } {print HOST, \$0}'" > $LOG_PIPE &
    shift
  done

  cat $LOG_PIPE

}

tailx "$@"
4

1 に答える 1

0

シェルが終了すると、EXITトラップが起動されます。をご覧いただくとわかりやすいです./tailx.sh。実行中のシェルはそれを に展開し$SHELL $PWD/tailx.sh ...ます。つまり、新しいシェル プロセス (別名サブシェル) が作成されます。

EXITこの子プロセスが終了したときに発生します。

スクリプトを実行sourceすると、トラップが現在のシェルにアタッチされるため、ターミナル ウィンドウを閉じるか、ログアウトしたときに実行されます。

于 2014-10-03T12:08:11.227 に答える