shell命令 - 命令执行时不存在路径的延迟stdout log



我有以下终端命令

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

但是,在执行时,路径/to/不存在,因为它是由Python脚本即时创建的,并且取决于相当复杂的args。因此,日志不会出现在任何地方。

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

在框外稍微思考,假设您在脚本结束之前将其在所需的位置...

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。本指南,尤其是底部的#10。

请注意,我也将stderr捕获到日志上。您将在大多数情况下,在同一日志中或其中一个。请注意,我实际上将stderr重定向到日志中,然后将dup'd dup dud dud do dot do stderr-这可能会使您付出缓冲的效率,但是可以为您节省您的头痛,这是由分别写入同一输出的缓冲流引起的误解线的头痛。

这是一个可怕的想法。但是,如果必须这样做,则可以:

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将尝试在调用cmd之前打开p/a/t/h。如果无法打开p/a/t/h, CMD`将永远不会被调用。