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?
linux
rename
file-descriptors
zogby
źródło
źródło
mv logfile logfile.bak
nie wystarczy. Czy mówisz, że proces będzie trwał do pisanialogfile.bak
? O ile mi wiadomo, nie jest to możliwe. Po prostu go odtworzylogfile
i 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.Odpowiedzi:
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
, lubcyclog
. 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
logrotate
napisano 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 jaknewsyslog
lublogrotate
(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.źródło