【发布时间】:2015-06-18 07:58:57
【问题描述】:
我有一个作为服务启动的主脚本。
我无法修改这个主脚本,因为它经常更新。 这个主脚本启动一个程序,它将任何日志回显到标准输出。
所以我看不到这个程序的任何日志。
但是这个主脚本在开头调用了一个钩子脚本,我可以修改它。
如果我将标准输出重定向到这个钩子脚本中的一个文件,它适用于该脚本,但不适用于主脚本。
是否可以更改整个过程的标准输出?
主要(enigma2.sh):
# hook to execute scripts always before enigma2 start
if [ -x enigma2_pre_start.sh ]; then
enigma2_pre_start.sh
fi
...
#this logs to stdout
/usr/bin/enigma2
...
钩子(enigma2_pre_start.sh)
exec > /tmp/`date +"%s"`.log
exec 2> /tmp/`date +"%s"`_error.log
编辑:
是否可以在主进程启动后将 tee(或类似的)附加到主进程? 我知道主脚本只运行一次。所以我可以用ps获取进程ID。
【问题讨论】:
-
enigma2_pre_start.sh由新的 shell 进程执行,因此它不能轻易更改其父进程中的 stdout 和 stderr。如果enigma2_pre_start.sh的来源类似于. enigma2_pre_start.sh而不是被执行,这是可能的。有可能改变它吗?如果不可能,是否可以更改服务启动脚本? -
不,我可以更改主脚本或启动脚本,因为如果系统得到更新,这两个文件都会被覆盖。
-
那么恕我直言,简单的解决方案是不可能的。尽管如此,您仍然可以在
enigma2_pre_start.sh中尝试一些肮脏的技巧。例如,您可以在enigma2.sh中找到以enigma2_pre_start.sh开头的行,然后将行更改为sed,以便获取脚本并重新运行enigma2.sh。当enigma2_pre_start.sh检测到自己开始的行已经更改时,只需重定向标准输入和标准输出并继续。当它完成后,杀死它的父级以防止双重运行。 -
这是个好主意。谢谢。
标签: linux bash redirect command-line sh