Shell 命令 - 延迟标准输出日志,因为在命令执行时路径不存在
Shell command - delay stdout log as path does not exist at command execution
我有以下终端命令
python run.py args > path/to/log.txt
然而,在执行时,path/to/ 并不存在,因为它是由 python 脚本动态创建的,并且依赖于相当复杂的 args
。因此,日志不会出现在任何地方。
有没有办法延迟日志写入(假设 5 秒),以便 python 命令有时间创建 path/to/
?
这是个糟糕的主意。但是,如果你必须这样做,你可以这样做:
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
。它不是写入您要延迟的日志,而是文件的 opening/creation。当您 运行 cmd > p/a/t/h
时,shell 将在调用 cmd
之前尝试打开 p/a/t/h
。如果无法打开 p/a/t/h,
cmd` 将永远不会被调用。
稍微跳出框框思考,假设您在脚本结束前将此日志放在您想要的位置...
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 link,不是 symlink。创建 link 后,您可以删除第一个路径,就像您一直写入第二个路径位置一样。数据仍将位于相同磁盘位置和 inode 编号的同一文件中,只是通过所需路径以新名称引用。
c.f。 this guide,尤其是底部的#10。
请注意,我也将 stderr 捕获到日志中。大多数时候,您会希望在同一个日志中或它自己的一个日志中。请注意,我实际上将 stderr 重定向到日志,然后将 stdout 复制到 stderr - 这可能会降低缓冲的效率,但可以避免因写入同一输出的单独缓冲流而导致的错误排列行的头痛。
我有以下终端命令
python run.py args > path/to/log.txt
然而,在执行时,path/to/ 并不存在,因为它是由 python 脚本动态创建的,并且依赖于相当复杂的 args
。因此,日志不会出现在任何地方。
有没有办法延迟日志写入(假设 5 秒),以便 python 命令有时间创建 path/to/
?
这是个糟糕的主意。但是,如果你必须这样做,你可以这样做:
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
。它不是写入您要延迟的日志,而是文件的 opening/creation。当您 运行 cmd > p/a/t/h
时,shell 将在调用 cmd
之前尝试打开 p/a/t/h
。如果无法打开 p/a/t/h,
cmd` 将永远不会被调用。
稍微跳出框框思考,假设您在脚本结束前将此日志放在您想要的位置...
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 link,不是 symlink。创建 link 后,您可以删除第一个路径,就像您一直写入第二个路径位置一样。数据仍将位于相同磁盘位置和 inode 编号的同一文件中,只是通过所需路径以新名称引用。
c.f。 this guide,尤其是底部的#10。
请注意,我也将 stderr 捕获到日志中。大多数时候,您会希望在同一个日志中或它自己的一个日志中。请注意,我实际上将 stderr 重定向到日志,然后将 stdout 复制到 stderr - 这可能会降低缓冲的效率,但可以避免因写入同一输出的单独缓冲流而导致的错误排列行的头痛。