【问题标题】:Redirect all output in a bash script when using set -x, capture pid and all output使用 set -x 时重定向 bash 脚本中的所有输出,捕获 pid 和所有输出
【发布时间】:2014-09-22 07:05:30
【问题描述】:

我正在修改一个旧脚本,由于某种原因它使用了一个子shell。我不确定是不是 subshel​​l 是什么让我绊倒了。我真正想要的是启动一项服务并将所有 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>改成&>看看能不能用。

标签: linux bash shell unix


【解决方案1】:

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

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

【讨论】:

  • 谢谢@konsolebox,我认为它有效,但我不完全确定我理解解决方案。您是说这里发生了两个单独的重定向吗? “让 fd 2 复制它”是什么意思。意思是复制指令以重定向输出?
  • @b.long 是的,发生了两个单独的重定向。基本上,您只需操纵文件描述符即可处理相同的流或相同的文件。这并不容易解释,但您可以考虑阅读更多关于它的信息 herehere。维基百科也可能会给出一些info
  • 有趣,好的。在进一步的测试中,我最终修改了脚本。也许我的直觉在解决这个问题上是错误的。由于foo 长时间运行,我认为它需要后台运行,以便startFoo.sh 将用户返回到命令提示符,但现在我似乎捕获了错误的PID。我已经更新了我的问题。
  • @b.long foo 是您在 set -x/set +x 前后运行的唯一命令吗? foo 是脚本还是二进制文件?
  • 是的,foo 是在set -xset +x 之间运行的唯一命令,但我确实在set -x 之前有一个条件,并且我希望将一些附加输出定向到@987654332 @
猜你喜欢
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
  • 2014-11-17
  • 2011-10-04
相关资源
最近更新 更多