Bash Unix:Tee和PID

问题描述

案例1

RUN_LOG="run.log"
CMD="java -DprofileName=$PROFILE ..."

$CMD &
PID=$!

我能够奔跑并获取pid。

案例2

$CMD | tee $RUN_LOG

我能够运行并将结果记录到文件中。

您知道我如何才能同时加入两者吗? 我想登录文件和控制台,再加上pid作为ENV变量。

尝试1:

(echo "Command PID is $BASHPID";exec $CMD;) | tee $RUN_LOG

输出文件,但pid最终不在变量中。

尝试2:

$CMD & PID=$! >> $RUN_LOG

pid在ENV变量 PID 中,但日志文件为空。

总结,我需要在环境变量PID中获取pid,将CMD的执行日志输出到控制台和文件(“ run.log”)

解决方法

变量无法转义子外壳。通过文件或fifo编写您的pid:

tmp=$(mktemp -u)
mkfifo "$tmp"
( echo "$BASHPID" > "$tmp"; exec $CMD ) | tee "$RUN_LOG" &
pid=$(cat "$tmp")
rm "$tmp"