unix - 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”)
解决方案
变量不能转义子shell。改为通过文件或 fifo 写入您的 pid:
tmp=$(mktemp -u)
mkfifo "$tmp"
( echo "$BASHPID" > "$tmp"; exec $CMD ) | tee "$RUN_LOG" &
pid=$(cat "$tmp")
rm "$tmp"
推荐阅读
- java - 在Java中将2个字符串值分配给一个变量
- java - 从 JCanvas (Java) 创建图像
- c# - Moq:当对象是模拟对象时,如何附加到对象的委托属性?
- php - 与 Laravel 8 上的 setKeysForSaveQuery() 覆盖不兼容的方法
- prolog - 在prolog中找到一个数字的所有素数的问题
- java - 构造函数java中的抽象对象
- javascript - 第二个嵌入式 Javascript 不在 HTML 中运行
- java - Axon Saga 没有被创建
- r - 使用 tryFormats 转换时出现 as.Date 错误
- python - FastAPI 返回删除记录数