我有以下终端命令
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`将永远不会被调用。