Изменение пути перенаправления во время работы скрипта

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
1
06.11.2016, 15:33
2 ответа

Вы действительно не можете изменить перенаправленный stdout и / или stderr запущенного процесса в новый файл ( см. примечание ниже) (Это одна из причин использования перенаправленного stdout или stderr в качестве файлов журнала для длительно выполняющихся процессов, плохая идея .)

Когда процесс запущен, элементы перенаправления команды выполняются оболочкой, которая запускает процесс. Целевой файл открывается и создается, если необходимо, в правильном режиме (добавление или перезапись) и, возможно, обрезается до нуля байтов в зависимости от режима перенаправления. Затем дескриптор открытого файла передается дочернему процессу. Этот дескриптор открытого файла является единственной ссылкой на перенаправленный файл, который есть у дочернего процесса - буквально. Это ссылка на файл.

И это важный момент - как ссылка непосредственно на файл, открытый дескриптор находится на одном уровне с записью в каталоге для файла - «именем файла». Изменение этого имени или даже удаление этой записи каталога - например, с помощью команды rm - абсолютно не влияет на дескриптор открытого файла в процессе.

@ l0b0 ответ правильный: процессы, которым необходимо ротация журналов, как правило, используют обработчики SIGHUP для выполнения таких ротаций, но «ротация журналов» на самом деле не так проста в случае перенаправленного вывода - что делает новый выходной файл получит имя? Дочерний процесс не знает, что такое «имя» его stdout и / или stderr - и выходной «файл» может даже не быть файлом.

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

(Хорошо, может быть возможно изменить потоки stdout / stderr для запущенного процесса - но это то, что должно быть - опять же - спроектировал в процессе. Это не то, что готовый двоичный файл, такой как bash , будет делать автоматически, если вы отправите ему SIGHUP ... )

0
28.01.2020, 01:08

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

0
28.01.2020, 01:08

Теги

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