zmień deskryptor podczas zmiany nazwy pliku linux [zamknięte]

-1

Mam program w CentOS, który zapisuje swój dziennik do pliku. Kiedy zmieniam nazwę, program wciąż do niej zapisuje. Czy istnieje sposób na zmianę tego deskryptora pliku bez ponownego uruchamiania programu?

zogby
źródło
1
Proszę edytować swoje pytanie i dać trochę więcej szczegółów. Co to za proces? Czy to jest skrypt? Czy możesz zmienić nazwę w skrypcie / programie? Dlaczego musisz najpierw zmienić nazwę pliku, do którego jest zapisywany? Jak dokładnie ten proces zapisuje do pliku?
terdon
Czy możesz zmienić nazwę w skrypcie / programie? - Nie, nie mogę Dlaczego musisz najpierw zmienić nazwę pliku, do którego jest zapisywany? - Pilnie muszę wykonać kopię zapasową plików dziennika, ale nie mogę zatrzymać procesu, który do nich zapisuje.
zogby
Proszę edytować swój post, aby dodać nowe informacje, to jest trudne do odczytania i łatwo przegapić w komentarzach. To jest nadal niejasne. Jeśli potrzebujesz kopii zapasowej, po prostu skopiuj plik gdzie indziej, nie musisz niczego zatrzymywać. Jeśli zmienisz jego nazwę, w jaki sposób proces nadal do niego pisze? Czy to nazwana rura? Twardy link? Nie możemy pomóc, jeśli nie dodać więcej szczegółów (po edycji ing zapytanie).
terdon
@terdon Przepraszamy, nie rozumiem, co jest niejasne. W jakiś sposób proces wciąż zapisuje plik, mimo że zmieniłem jego nazwę. Muszę utworzyć kopię zapasową z tego pliku dziennika i opróżnić ten plik dziennika.
zogby
Dopiero teraz wspomniałeś, że musisz usunąć plik. Nie wyjaśniłeś, dlaczego proste mv logfile logfile.baknie wystarczy. Czy mówisz, że proces będzie trwał do pisania logfile.bak? O ile mi wiadomo, nie jest to możliwe. Po prostu go odtworzy logfilei będzie pisał dalej. Jeśli to wszystko nie jest prawdą, musisz nam dokładnie powiedzieć, jaki proces i jaki system plików, i dać powtarzalny przykład, ponieważ opisujesz coś, co jest niezwykle dziwne.
terdon

Odpowiedzi:

2

W jakiś sposób proces wciąż zapisuje plik, mimo że zmieniłem jego nazwę.

Nazywa się to normalnym działaniem systemu operacyjnego . Po otwarciu pliku nie ma znaczenia ani jeden proces (y) z otwartym deskryptorem pliku, jakie nazwy ma plik, ani nawet to, czy plik w ogóle ma nazwę.

Mówiąc najprościej, schemat logowania twojego programu (jeśli tak naprawdę jest) jest sofistyczny. Doświadczasz dokładnie, dlaczego jest on somatyczny. Ten plik będzie się powiększał i trwał przez cały czas, dopóki program generujący dziennik będzie działał, dopóki nie zużyje całego miejsca na dysku dostępnego dla użytkownika, z którego działa. (Niebo pomoże ci, jeśli twój program działa jako superużytkownik.) Jeśli rozłączysz plik, program będzie nadal zjadał miejsce na dysku w nieskończoność, ponieważ plik istnieje na dysku bez nazwy, dopóki jego ostatni otwarty deskryptor pliku nie zostanie zamknięty. I nie można obrócić pliku dziennika ani zresetować pozycji otwartego deskryptora pliku spoza samego programu. Więc nawet obcięcie nie działa, ponieważ program kontynuuje pisanie od swojej ostatniej pozycji, asta osoba odkryła .

Nie ma nic, co możesz zrobić teraz, bez dołączania debuggera, aż do zakończenia programu. Następnym razem powiedz programowi, aby zalogował się do standardowego błędu lub standardowego wyjścia, jeśli jest to w ogóle możliwe. Następnie wysłać ten błąd standardowy / standardowe wyjście poprzez rurę do programu takiego jak multilog, multilog, s6-log, svlogd, tinylog, lub cyclog. Otrzymasz zestaw plików dziennika z automatycznie zmienianym i obracanym na żądanie limitem rozmiaru.

Następnym gorszym działaniem jest otwarcie pliku w trybie dołączania. Będziesz musiał się zastanowić, kopiując i obcinając dziennik, ponieważ obracanie przez zmianę nazwy pliku nadal nie będzie działać; i oczywiście może to spowodować utratę danych dziennika, jak logrotatenapisano na stronie podręcznika, z powodu możliwości między utworzeniem kopii a obcięciem pliku. Wyżej wymienione narzędzia rejestrujące nie tracą danych dziennika w nieprzewidywalnych punktach z powodu rotacji dziennika przez takie jak newsysloglub logrotate(które nie są potrzebne i nie są używane). Używaj ich w połączeniu z nadzorcą procesu, który utrzymuje potok w stanie otwartym, a nawet nie tracą danych dziennika, gdy ktoś ponownie konfiguruje i ponownie uruchamia rejestrator w locie.

JdeBP
źródło