【发布时间】:2014-09-22 07:05:30
【问题描述】:
我正在修改一个旧脚本,由于某种原因它使用了一个子shell。我不确定是不是 subshell 是什么让我绊倒了。我真正想要的是启动一项服务并将所有 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.sh 和 foo,但我不知道该怎么做。这通常是如何处理的?
更新:解决方案(感谢与@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>改成&>看看能不能用。