首页 > 解决方案 > 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”)

标签: unixpidtee

解决方案


变量不能转义子shell。改为通过文件或 fifo 写入您的 pid:

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

推荐阅读