Командная консоль - задержка журнала стандартного вывода, поскольку путь не существует при выполнении команды - PullRequest
1 голос
/ 21 марта 2019

У меня есть следующая терминальная команда

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

Однако при выполнении путь / к / не существует, так как он создается на лету скриптом python, и которыйзависит от довольно сложного args.Поэтому журнал нигде не появляется.

Есть ли способ отложить запись журнала (скажем, на 5 секунд), чтобы у команды python было время для создания path/to/?

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Немного подумав, предположим, что у вас есть , чтобы иметь этот журнал там, где вы хотите, до завершения сценария ...

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 ссылка , не символическая ссылка. После создания ссылки вы можете удалить первый путь, и все будет так, как если бы вы писали во второе местоположение пути все время. Данные по-прежнему будут находиться в том же файле с тем же расположением диска и номером инода, на который будет ссылаться новое имя через желаемый путь.

c.f. это руководство , особенно # 10 внизу.

Обратите внимание, что я записал в журнал и stderr. Вы будете хотеть это большую часть времени, в том же журнале или в одном из его собственных. Обратите внимание, что я на самом деле перенаправил stderr в журнал, а затем dup'd stdout в stderr - это может стоить вам эффективности буферизации, но может избавить вас от головной боли, связанной с ошибочными строками, вызванными отдельно буферизованными потоками, записанными на один и тот же вывод.

0 голосов
/ 21 марта 2019

Это ужасная идея.Но, если вы должны это сделать, вы можете сделать:

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, оболочка попытается открыть p/a/t/h, прежде чем вызовет cmd.Если он не может открыться, p/a/t/h, cmd` никогда не будет вызван.

...