gpt4 book ai didi

linux - 使用 set -x 时重定向 bash 脚本中的所有输出,捕获 pid 和所有输出

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:53:33 25 4
gpt4 key购买 nike

我正在修改一个旧脚本,出于某种原因它使用了一个子 shell。我不确定是不是子 shell 让我绊倒了。我真正想要的是启动一项服务并将所有 STDOUT 和 STDERR 及其 PID 捕获到一个文件中。此外,我还希望日志文件中有一些调试信息。考虑下面的脚本 (startFoo.sh):

#!/bin/bash
VARIABLE=$(something_dynamic)
echo "Some output"
(
# Enable debugging
set -x
foo -argument1=bar \
-argument2=$VARIABLE

# Disable debugging
set +x

) > /tmp/foo_service.log 2>&1 &
OUTER_PID=$!
echo $OUTER_PID > foo.pid

这似乎是可行的,因为我将大部分输出以及 PID 都捕获到日志中,但由于某种原因,并非所有输出都被重定向。当我运行脚本时,我在终端中看到了这个:

[me@home ~]$ sudo startFoo.sh
Some output
[me@home ~]$ + foo -argument1=bar -argument2=value

如何压缩提示符中的输出 [me@home ~]$ + foo...

注意,这个问题可能与另一个问题有关: redirect all output in a bash script when using set -x ,但是我的具体用法不同。

更新:我的脚本现在看起来像这样,但有些地方还是不太对劲:

#!/bin/bash
VARIABLE=$(something_dynamic)
echo "Some output"
(
# Enable debugging
set -x
foo -argument1=bar \
-argument2=$VARIABLE

# Disable debugging
set +x

) > /tmp/foo_service.log 2>&1 &
PID=$!
echo $PID > foo.pid

但是,当我这样做时,PID 文件包含 startFoo.sh 的 PID,而不是我真正想要捕获的 foo 的实际调用能够杀死。理想情况下,我可以用一个 PID 杀死 startFoo.shfoo,但我不确定该怎么做。这通常是如何处理的?

更新:解决方案(感谢与@konsolebox 的对话)如下:

#!/bin/bash 
VARIABLE=$(something_dynamic)
echo "Some output"
{
# Enable debugging
set -x
foo -argument1=bar \
-argument2="$VARIABLE" &
PID=$!
echo $PID > foo.pid

# Disable debugging
set +x
} > /tmp/foo_service.log 2>&1

最佳答案

2>&1>/tmp/foo_service.log 更改为 >/tmp/foo_service.log 2>&1

你应该首先将 fd 1 重定向到文件,然后让 fd 2 复制它。你在前者上所做的是首先将 fd 2 重定向到 1,它只复制默认的 stdout,而不是在它之后打开的文件的 fd。

关于linux - 使用 set -x 时重定向 bash 脚本中的所有输出,捕获 pid 和所有输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25040220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com