Jak obciąć plik używany do przekierowania standardowego wyjścia

4

Próbuję obciąć plik używany do przekierowania standardowego wejścia. Na przykład:

ping localhost>/tmp/test.log

Jeśli zadzwonię, rm /tmp/test.logprzekierowanie zatrzymuje się, ale polecenie działa.

Jeśli zadzwonię truncate -s0 /tmp/test.loglub >/tmp/test.loglub echo ..i itd. Przekierowanie działa, ale plik zawiera początkowe zera, ponieważ pozycja strumienia nie uległa zmianie.

Jak mogę obciąć plik?

Jan
źródło
1
Uwaga: rm /tmp/test.logusuwa pozycję pliku z katalogu, ale sam plik nadal istnieje, zajmuje miejsce i rośnie w systemie plików opartym na i-węzłach. Zostanie on naprawdę usunięty, gdy nie będzie już używany, tj. Kiedy pingzostanie rozwiązany lub nawet później.
Kamil Maciorowski
Po prostu włącz obcinanie w swojej procedurze. Wyślij 10.000 pingów lub cokolwiek, usuń plik i napisz nowy.
Seth
Co masz na myśli; co chcesz się wydarzyć Chcesz wielokrotnie pingswoje localhost, i zachować aktualizacji /tmp/test.log, tak że zawiera on tylko statystykami wyjściowych z ostatniej odpowiedzi ICMP?
tjt263

Odpowiedzi:

2

Musisz zrozumieć systemy plików Unix, zanim będziesz mógł odpowiedzieć na to pytanie.

Jedyne, co rmrobi, to wymazanie nazwy plików , co oznacza wskaźnik ze struktury katalogów do bloków dyskowych.

Kiedy biegniesz

ping localhost > /tmp/test.log
rm /tmp/test.log

przekierowanie nie zatrzymuje się. Polecenie nadal działa, a dane gromadzą się w obszarze dysku. Po prostu nie masz prawa dostępu do tych danych, ponieważ skasowałeś ich nazwę.

Możesz utworzyć kolejny, zupełnie niepowiązany plik o nazwie /tmp/test.log.

Jak zauważyłeś, próbując skrócić plik, pozbywasz się danych, które tam były, ale wewnętrzny deskryptor pliku zna pozycję w pliku, na który wskazuje, i zapisuje po rozszerzeniu pliku. Stąd wiodące zera.

Jeśli chcesz „zresetować” przekierowanie, musisz zabić pingprogram, usunąć lub skrócić /tmp/test.logplik, a następnie ponownie uruchomić pingprogram.

Możesz także użyć programu takiego jak rotatelogs

ping localhost | rotatelogs ping.out.%Y%m%d.%H%M 600

aby obrócić plik dziennika na podstawie upływu czasu lub rozmiaru pliku.

hymie
źródło
„Po prostu nie masz prawa dostępu do tych danych, ponieważ skasowałeś wskaźnik systemu plików”. Zasadniczo nie jest to prawdą. Sztuką jest użycie /proc/<PID>/fd/0ścieżki.
Kamil Maciorowski
0

Planować naprzód:

  1. Obetnij lub usuń plik, jeśli istnieje.
  2. Użyj >>zamiast >.

W ten sposób skorzystasz z faktu, że >>zasadniczo „zawsze staraj się do końca pliku”, >zachowując wskaźnik do ostatniej zapisanej lokalizacji.

Następnie możesz obciąć plik i >>zastosować się do niego. Zobacz moją odpowiedź , bada dokładne zachowanie, którego potrzebujesz.

Kamil Maciorowski
źródło