当tee命令重定向到子shell时,最后两行丢失

时间:2013-11-05 08:36:14

标签: bash ssh tee process-substitution rexec

我有以下解决方案来记录在远程机器上执行的命令及其输出:

rexec:// -t -t /usr/bin/ssh -q -x -o StrictHostKeyChecking=no -2 \
         -l ${SSHUserName} -p 22 ${mainHost} \
 | tee >(/opt/oss/clilogging/bin/clilogging.sh para1 para2)

clilogging.sh会将每个命令及其输出记录到日志文件中 但是,有时最后退出的命令及其输出消息“logout”不会写入日志文件。

clilogging.sh如下:

#!/bin/bash

{
    while read R || [ -n "$R" ];do
        #e.g. 2013-08-19T09:58:08+0300
        timestamp=`date +%FT%T%z`;
        echo $timestamp $R;
    done
} > /tmp/xxx.log

有人能帮帮我吗? 非常感谢!

1 个答案:

答案 0 :(得分:1)

感谢汤姆的评论,谢谢大家 我找到了这个问题的解决方案。

需要在clilogging.sh

的开头添加以下代码
trap "" HUP

代码的含义是处理SIGHUP信号,这里我忽略了这个信号,然后clilogging.sh
不会立即退出并有机会处理所有缓冲区。

man 7 signal

   Signal     Value     Action   Comment
   -------------------------------------------------------------------------
   SIGHUP        1       Term    Hangup detected on controlling terminal
                                 or death of controlling process