You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash中exec命令输出写入日志并单独存储PID的问题求助

问题分析与解决方案

你的命令存在几个关键问题,导致无法正确将日志写入文件并记录目标进程的PID,我来逐一拆解并给出修正方案:

错误点解析

  1. 重定向语法错误:你连续使用了两个>>,第二个>>后面跟着echo $$ > ...完全不符合Bash语法——重定向的目标应该是文件路径,而非命令。你试图同时完成日志输出和PID记录,但写法逻辑混乱。
  2. PID捕获错误:$$代表的是当前执行这条命令的Shell进程PID,不是你启动的./node进程的PID。因为你用&把命令放到后台,此时$$指向的是父Shell的ID,不是后台运行的node进程ID,记录的PID会完全错误。
  3. 缺失错误日志重定向:你的命令只重定向了标准输出(stdout),但进程的错误输出(stderr)会直接打印到终端,没有写入日志文件,这会导致调试时遗漏关键错误信息。

正确实现方案

方案1:常规后台启动(推荐)

不需要用exec,直接启动进程并捕获正确的PID:

./node -connect-manager -manager-address $MANAGER_IP:5998 -manager-web $MANAGER_IP:8000 >> /var/log/skywirenode.log 2>&1 &
echo $! > /home/odrod420/skywireScript/node.pid
  • 2>&1:将标准错误(stderr)合并到标准输出(stdout),确保所有日志都写入文件;
  • &:将进程放到后台运行;
  • $!:Bash的特殊变量,代表最后一个后台运行进程的PID,这正是你需要记录的node进程ID。

方案2:使用exec的场景(替换子Shell)

如果确实需要用exec(比如让node进程替换子Shell进程),可以用子Shell包裹exec命令,再捕获后台进程PID:

(exec ./node -connect-manager -manager-address $MANAGER_IP:5998 -manager-web $MANAGER_IP:8000 >> /var/log/skywirenode.log 2>&1) &
echo $! > /home/odrod420/skywireScript/node.pid

这里的(...)会创建一个子Shell,exec会替换这个子Shell为node进程,后台运行后$!就是子Shell(即node)的PID,同样能正确记录。

内容的提问来源于stack exchange,提问作者McJohnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:20:50