【问题标题】:How to detect in bash script where stdout and stderr logs go?如何在 bash 脚本中检测 stdout 和 stderr 日志所在的位置?
【发布时间】:2017-05-09 07:11:59
【问题描述】:

我有一个从 cron 调用的 bash 脚本,它使用不同的参数多次调用,并将它们的输出重定向到不同的日志,大致如下:

* * * * * /home/bob/bin/somescript.sh someparameters >> /home/bob/log/param1.log 2>&1

在这种情况下,我需要我的脚本在某个变量中获取值“/home/bob/log/param1.log”。它也可以为 logfilename 而不是“param1”计算日期。到目前为止,主要原因是为了类似目的重复使用相同的脚本,并且能够通过受监控的文件夹通知用户他应该在哪里寻找更多信息 - 在一些警告文件中给他一个日志文件名。

如何检测输出(&1 或 &1 和 &2)进入哪个日志?

【问题讨论】:

    标签: bash logging stdout


    【解决方案1】:

    如果您运行的是 Linux,您可以从 proc 文件系统中读取信息。假设你在stdout.sh.中有以下程序

    #! /bin/bash
    readlink -f /proc/$$/fd/1 >&2
    

    它以交互方式显示您的终端。

    $ ./stdout.sh 
    /dev/pts/0
    

    并通过重定向显示目的地。

    $ ./stdout.sh > nix
    /home/ceving/nix
    

    【讨论】:

      【解决方案2】:

      在运行时 /usr/bin/lsof 或 /usr/sbin/lsof 给出打开的文件

      lsof -p $$ -a -d 1
      
      lsof -p $$ -a -d 2
      
      
      filename1=$(lsof -p $$ -a -d 1 -F n)
      filename1=${filename1#*$'\n'n}
      
      filename2=$(lsof -p $$ -a -d 2 -F n)
      filename2=${filename2#*$'\n'n}
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-09
      • 2022-09-30
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2022-12-07
      相关资源
      最近更新 更多