我正在修改旧脚本,由于某种原因它使用子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.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
答案 0 :(得分:3)
将2>&1> /tmp/foo_service.log
更改为>/tmp/foo_service.log 2>&1
。
首先应将fd 1重定向到文件,然后让fd 2复制它。你在前者上做的是你首先将fd 2重定向到1,它只复制默认的stdout,而不是文件后面打开的fd。