我有以下终端命令
python run.py args > path/to/log.txt
但是,在执行时,path / to /不存在,因为它是由python脚本动态创建的,它取决于相当复杂的args
。因此,该日志不会出现在任何地方。
是否有一种方法可以延迟日志写入(比方说延迟5秒),以便python命令有时间创建path/to/
?
答案 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`,将永远不会被调用。