Как правильно запустить программу и сделать возможным перенаправить ее вывод выполнения (stdout и stderr) на более позднем этапе?

можно использовать , в то время как цикл:

while IFS= read -r _file
do
    cp "$_file" ~/Desktop/temp
done < "files.txt"

IFS установлен в нулевое значение, что не приводит к расщеплению, а -r говорит о том, что бэш экранирует символ обратного слеша.

1
13.04.2017, 15:36
3 ответа

Я нашел решение с помощью mkfifo, который создает именованную трубу, или FIFO.
Проще всего создать символическую ссылку, и можно использовать все перенаправления, разрешенные оболочкой.

mkfifo MyOutput

ls -l дает

0 prw-r--r-- 1 My_username My_username  0 May 11 17:45 MyOut|

Я могу запустить программу с перенаправлением на эту ссылку

./Execute_program > MyOutput  &  cat MyOutput 

и вывод начинает идти на терминал.

Если я нажимаю ctrl+c, я прерываю поток, но не запущенный процесс (для этого мне нужно использовать что-то вроде kill pid или kill %1).
Когда во второй раз я попрошу FIFOs сделать дамп на терминал (снова с cat MyOutput), он начнет делать дамп вывода с этого момента.

Примечания и предупреждения:

  • Пока я не попрошу дамп от FIFOs, он будет держать весь вывод.
    Как только я попрошу первый раз, он будет смывать все.
  • Я могу перенаправить (или добавить) в другой файл cat MyOutput >> NewRealFile
  • Я могу использовать cat MyOutput и из другого терминала!
  • Warning: Если я попрошу 2 разные программы (или экземпляры) перенаправить вывод в одинаковые FIFO, поток будет слит (нет априорного способа отличить, из какой программы пришла эта строка).
  • Warning: Если я запрошу 2 или более раз (возможно, с разных терминалов), он выдаст по одной строке на каждый запрос, разделяя вывод запрашивающему. Может быть, есть безопасный обходной путь...
1
27.01.2020, 23:38
[119322]Если я правильно понял ваш вопрос:

enter image description here

то для мониторинга вы можете сделать что-то вроде:

Вы можете использовать реальные файлы вместо Fifos

затем tail -f они будут заменены при повторном запуске скриптов.

Я предпочитаю второй метод, или просто использование мультиплексора (т.е. экрана или того, что когда-либо популярная реинкарнация на этой неделе)

#!/bin/bash

while [ 1 ]
do
    rsync -avz --partial source dest
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 180
    fi
done

затем

awk '{while(match($0,"[$]{[^}]*}")) {var=substr($0,RSTART+2,RLENGTH -3);gsub("[$]{"var"}",ENVIRON[var])}}1' < input.txt > output.txt

для "мониторинга" и ctrl+a d для отладки.

Убедитесь, что в конце вашего скрипта есть пауза, если вы хотите увидеть результат после его запуска. [119337]

1
27.01.2020, 23:38

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

0
27.01.2020, 23:38

Теги

Похожие вопросы