【问题标题】:Redirect stdout using exec in subscript在下标中使用 exec 重定向标准输出
【发布时间】: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


【解决方案1】:

您必须获取enigma_pre_start.sh 而不是执行它,以便exec 命令在您要更改其文件句柄的同一进程中运行。

if [ -x enigma2_pre_start.sh ]; then
    . enigma2_pre_start.sh
fi

否则,您将重定向执行钩子脚本的进程的标准输出和错误,脚本完成后立即退出。

【讨论】:

  • 我无法更改主脚本,因为如果系统收到更新,两个文件都会被覆盖。
  • 那你就不走运了。您不能从另一个进程更改当前进程的重定向标准输出。
【解决方案2】:

基于“Zaboj Campula”评论的解决方案:

if /bin/grep -q "^[[:space:]]/usr/bin/enigma2_pre_start.sh$" /var/bin/enigma2.sh
then
        echo Unpatched > /tmp/enigma.sh
        /bin/sed -e 's/^\t\(\/usr\/bin\/enigma2_pre_start.sh\)$/\t\. \1/g' /var/bin/enigma2.sh -i
        pid=`/bin/ps -o ppid= $$` && /bin/kill $pid
fi

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2014-01-20
    相关资源
    最近更新 更多