Восстановление открытого файла

У меня есть интересная проблема, которая может иметь или не иметь решения, но я хотел бы иметь один, если это возможно:

В Solaris был удален открытый файл журнала, который по-прежнему сохраняется во время выполнения процесса, но теперь недоступен для всех других инструментов, таких как cat , tail и т. Д.

Есть ли способ восстановить запись в каталоге этого файла, пока все работает?

One Solution collect form web for “Восстановление открытого файла”

Это выполнимо, с некоторыми хаками и ограничениями (вам нужны привилегии root).

Сначала найдите, какой файловый дескриптор использует приложение для записи файла журнала, затем создайте символическую ссылку в предыдущем местоположении файла журнала и указав на запись файла / proc, например:

 ln -s /var/tmp/file.log /proc/12345/fd/3 

Первое ограничение состоит в том, что если файл был открыт только для записи процессом, его разрешение не позволит непривилегированному пользователю читать его содержимое. Однако root и пользователи с привилегией file_dac_read не будут затронуты. Кроме того, вы можете использовать процесс для копирования содержимого файла с помощью tail как говорит Жиль в своем комментарии. например:

 tail -c +1 -f /proc/12345/fd/5 > /var/tmp/file.log 

Вторая проблема заключается в том, что весь файл будет потерян ( ln -s ) или его часть ( tail -c 1 -f ), когда процесс либо закрывает его, либо завершает работу.

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

Вероятными инструментами для работы являются dtrace, truss, mdb или dbx.

Вот доказательство концепции, использующее dtrace в Solaris 10.

 #!/bin/ksh # # This dtrace script is monitoring a file descriptor for a given process # and copy its content to the given path when the file is closed. # pid=${1:?"$0: Usage: pid fd path"} fd=${2:?} path=${3:?} [[ -f $path ]] && { echo "$path exists"; exit 1; } dtrace -w -n ' syscall::close:entry /pid=='$pid' && arg0=='$fd'/ { stop(); system("cp /proc/%d/fd/%d %s",pid,arg0,"'"$path"'"); system("prun %d",pid); exit(0); }' 
  • Почему задачи CRONTAB теряются при выходе из сеанса Putty?
  • FreeBSD не Unix. Но его Unix-подобный Unix. Где же тогда основной Unix читает исходный код?
  • Как удалить файл с помощью команды mv?
  • Какова цель оболочки uucico на HP-UX, Solaris и, возможно, других Unix-разновидностях?
  • solaris + fit egrep для solaris
  • Как установить программное обеспечение Netbackup в Solaris?
  • Пределы дескриптора файла в / etc / system vs /etc/sysctl.conf vs /etc/security/limits.conf в Solaris
  • как бороться с сложной иерархией?
  • Solaris sulog при использовании sudo
  • Как использовать grep для поиска текстовой строки в файлах в подпапках родительской папки без ключа -r
  • Solaris SMF vs Linux Upstart
  • Зачем было необходимо перезапустить веб-сервер apache для копирования файлов через php на недавно смонтированный файл?
  • Linux и Unix - лучшая ОС в мире.