Bash中exec命令输出写入日志并单独存储PID的问题求助
问题分析与解决方案
你的命令存在几个关键问题,导致无法正确将日志写入文件并记录目标进程的PID,我来逐一拆解并给出修正方案:
错误点解析
- 重定向语法错误:你连续使用了两个
>>,第二个>>后面跟着echo $$ > ...完全不符合Bash语法——重定向的目标应该是文件路径,而非命令。你试图同时完成日志输出和PID记录,但写法逻辑混乱。 - PID捕获错误:
$$代表的是当前执行这条命令的Shell进程PID,不是你启动的./node进程的PID。因为你用&把命令放到后台,此时$$指向的是父Shell的ID,不是后台运行的node进程ID,记录的PID会完全错误。 - 缺失错误日志重定向:你的命令只重定向了标准输出(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
相关产品推荐
相关产品推荐

