sed -e '
4,$!d; # skip non-relevant portion
/Name:/N; # grab the line coming after Name:
/\n.* /d; # what we were after is not this
P;D
' yourfile
Вы действительно не можете изменить перенаправленный stdout
и / или stderr
запущенного процесса в новый файл ( см. примечание ниже) (Это одна из причин использования перенаправленного stdout
или stderr
в качестве файлов журнала для длительно выполняющихся процессов, плохая идея .)
Когда процесс запущен, элементы перенаправления команды выполняются оболочкой, которая запускает процесс. Целевой файл открывается и создается, если необходимо, в правильном режиме (добавление или перезапись) и, возможно, обрезается до нуля байтов в зависимости от режима перенаправления. Затем дескриптор открытого файла передается дочернему процессу. Этот дескриптор открытого файла является единственной ссылкой на перенаправленный файл, который есть у дочернего процесса - буквально. Это ссылка на файл.
И это важный момент - как ссылка непосредственно на файл, открытый дескриптор находится на одном уровне с записью в каталоге для файла - «именем файла». Изменение этого имени или даже удаление этой записи каталога - например, с помощью команды rm
- абсолютно не влияет на дескриптор открытого файла в процессе.
@ l0b0 ответ правильный: процессы, которым необходимо ротация журналов, как правило, используют обработчики SIGHUP
для выполнения таких ротаций, но «ротация журналов» на самом деле не так проста в случае перенаправленного вывода - что делает новый выходной файл получит имя? Дочерний процесс не знает, что такое «имя» его stdout
и / или stderr
- и выходной «файл» может даже не быть файлом.
Схемы ротации журналов должны быть спроектированы в процессе - ведение журнала должно быть интегрировано таким образом, чтобы записи журнала не терялись, например, во время ротации файла журнала.
(Хорошо, может быть возможно изменить потоки stdout
/ stderr
для запущенного процесса - но это то, что должно быть - опять же - спроектировал в процессе. Это не то, что готовый двоичный файл, такой как bash
, будет делать автоматически, если вы отправите ему SIGHUP
... )
Большое спасибо всем за ответы, я не смог найти способ сделать это, поэтому в качестве обходного пути я настроил кронтаб, чтобы остановить оригинальный скрипт, сделать ротацию и запустить его снова в пике.