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

标签 linux bash shell unix

我正在修改一个旧脚本,出于某种原因它使用了一个子 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/

相关文章:

linux - Bash 脚本 -e 未检测到变量中的文件名

linux - 如何使用shell脚本读取属性文件

linux - Upstart 如果正在运行则停止

linux - 来自 bash 脚本的 source ~/.bashrc 不起作用

linux - 如何确定 rpm 安装是否正在进行?

linux - 将 sudo 与其他命令一起使用

bash - 如何在 bash 中转义 sqlite3 查询参数?

linux - 将 "read"用于变量中未知数量的输入

linux - 'ln' 或 'ln -s' 的用法或应用场景是什么?

git - 在 post-update hook 中查找 Git 分支名称