Shell命令-延迟标准输出日志,因为命令执行时路径不存在

时间:2019-03-21 10:51:40

标签: python bash shell logging stdout

我有以下终端命令

python run.py args > path/to/log.txt

但是,在执行时,path / to /不存在,因为它是由python脚本动态创建的,它取决于相当复杂的args。因此,该日志不会出现在任何地方。

是否有一种方法可以延迟日志写入(比方说延迟5秒),以便python命令有时间创建path/to/

2 个答案:

答案 0 :(得分:1)

稍微思考一下,假设您必须在脚本结束之前将其保存在所需的位置...

set -x                                    # log *this* process
tmp=$(mktemp)                             # make a throwaway filename
python run.py args 2>$tmp 1>&2 &          # log in bg to $tmp
until [[ -d path/to/ ]]; do sleep 1; done # wait for dir to exist
ln $tmp path/to/log.txt &&                # hard link log where you need it
  rm $tmp                                 # clean the temp if successful

这假设path/to//tmp/在同一设备上。如果不是,您将需要在同一设备上创建一个 的临时位置,因为本练习的重点是它是 hard 链接,而不是符号链接。创建链接后,您可以删除第一个路径,就像您一直写到第二个路径位置一样。数据仍将位于同一文件中的相同磁盘位置和inode编号中,只是通过所需路径以新名称进行引用。

c.f。 this guide,尤其是底部的#10。

请注意,我也将stderr捕获到了日志中。大多数情况下,您会希望使用同一日志或自己的日志。请注意,我实际上将stderr重定向到日志,然后将stdout重定向到stderr-这可能会降低您的缓冲效率,但可以避免因将单独缓冲的流写入同一输出而导致的行错位问题。 >

答案 1 :(得分:0)

这是一个糟糕的主意。但是,如果必须这样做,则可以执行以下操作:

python run.py args |  { sleep 1; cat > path/to/log.txt; }

但是,由于在调用此命令之前必须了解path/to,所以您最好这样做:mkdir -p path/to; python run.py args > path/to/log.txt。它不是尝试延迟的写入日志,而是打开/创建文件。运行cmd > p/a/t/h时,shell会在调用p/a/t/h之前尝试打开cmd。如果无法打开p/a/t/h, cmd`,将永远不会被调用。