Mam plik tekstowy w moim katalogu domowym, który regularnie otrzymuje dane za pośrednictwem zadania cron. Ponieważ zadanie cron zapewnia dane dynamiczne, chciałbym również ustawić zadanie cron w celu opróżnienia zawartości pliku (plik musi nadal istnieć). Nie potrzebuję pomocy z cronem, tylko polecenie, które może pomóc w opróżnieniu pliku.
command-line
sosytee
źródło
źródło
tail -n +1000 file.txt > file.txt
należy usunąć 1000 wierszy i zachować najnowsze wiersze w pliku (nigdy nie wiadomo, kiedy może być potrzebny jakiś najnowszy rekord do śledzenia czegoś).Odpowiedzi:
Najprostszy sposób:
Jest to mniej oczywisty sposób i prawdopodobnie mniej czytelny w skrypcie powłoki przez innych, ale to wszystko, czego potrzebujesz.
Ponieważ
>
tak naprawdę nie jest to naprawdę polecenie (jest wbudowane w bash), którego nie możesz użyć:gdy nie masz uprawnień do tego pliku. Ale możesz użyć:
źródło
sudo crontab -e
aby dodać zadanie cron dla roota, a nie dla ciebie. Lub zmienić uprawnienia pliku na 766 (lub 666), a nie do 755:sudo chmod 766 filename
. Więcej informacji: codex.wordpress.org/Changing_File_Permissionstruncate filename
jest trochę czystszy i prostszy niż przekierowywanie pustych danych wyjściowych do pliku i nie napotyka problemówsudo
.truncate -s 0 filename
rzeczywiście może załatwić sprawę . Możesz dodać to jako odpowiedź.W tym celu stworzono narzędzie:
Spowoduje to wyczyszczenie zawartości, ale nadal będzie to ten sam plik (i- węzeł pozostaje taki sam).
Jest to ważne, ponieważ niektóre programy trzymają uchwyt pliku „przez i-węzeł”. Załóżmy, że „opróżniłeś” plik przy użyciu naiwnej metody usuwania i ponownego tworzenia pliku. Niektóre programy mogą nadal trzymać uchwyt starego pliku (ze starą zawartością), nawet jeśli nie jest już widoczny zwykłymi środkami
ls
.Niektóre linki do bardziej szczegółowych informacji na końcu tej odpowiedzi.
Innym sposobem, może łatwiejszym do zapamiętania:
To także utrzymuje ten sam i-węzeł.
Należy zauważyć, że zarówno
truncate
iecho -n
nie są zdefiniowane przez POSIX .W celu zachowania zgodności z POSIX
cat /dev/null
:Jeszcze inny sposób, bardziej niejasny i prawdopodobnie nie zależny od powłoki:
Jeśli plik do obcięcia wymaga uprawnień administratora do zapisu, następujące linie nie będą działać zgodnie z oczekiwaniami:
Dzieje się tak, ponieważ przekierowanie jest wykonywane przez powłokę jeszcze przed uruchomieniem sudo. Oznacza to, że dostęp do zapisu do pliku odbywa się przy użyciu uprawnień użytkownika, który uruchamia powłokę, a nie uprawnień, które zostaną przyznane przez sudo.
Obejściem tego problemu jest odroczenie przekierowania do powłoki wykonanej przy użyciu uprawnień sudo:
Korzystanie z
truncate
ciebie nie wymaga takiego obejścia, ponieważ dostęp do zapisu nie jest wykonywany przez powłokę, ale przeztruncate
który jest wykonywany przez sudo przy użyciu uprawnień sudo.Aby uzyskać szczegółowe informacje o programach, które utrzymują otwarty plik, nawet jeśli plik został usunięty, możesz przeczytać:
źródło
Aby to zautomatyzować, możesz użyć logrotate. Po prostu stwórz plik konfiguracyjny dla pliku, który chcesz opróżnić, dodaj inne ustawienia i możesz automatycznie go opróżniać codziennie na podstawie kryteriów, które wybierasz na co dzień, lub gdy plik jest większy niż itp.
Zobacz, jak skonfigurować Logrotate: http://linuxcommand.org/man_pages/logrotate8.html
źródło
echo "" > foo_file
Jest to prosty sposób na osiągnięcie tego, zastąpi ona całą zawartość foo_file z „” czyni to w tym przypadku opróżnienia.Możesz także użyć
cat /dev/null > foo_file
, który odczyta zerowe urządzenie i nadpisze twój plik niczym.źródło