Zamień plik na twardy link do / dev / null

32

Korzystam z aplikacji, która zapisuje do log.txt. Aplikacja została zaktualizowana do nowej wersji, dzięki czemu obsługiwane wtyczki nie są już kompatybilne. Wymusza ogromną liczbę błędów w log.txt i nie obsługuje zapisywania do innego pliku dziennika.

Jak mogę zapisać je w innym dzienniku?

Zastanawiałem się nad zastąpieniem log.txt twardym łączem (aplikacja nie może odróżnić właściwej różnicy?) Lub twardym łączem wskazującym / dev / null. Jakie są moje opcje?

MALON
źródło
Nie możesz tak po prostu chmod -w log.txt?
user168715

Odpowiedzi:

30
# cp -a /dev/null log.txt

Spowoduje to skopiowanie twojego zerowego urządzenia z odpowiednimi głównymi i mniejszymi numerami programistycznymi log.txt, abyś miał inny null.

Urządzenia w ogóle nie są znane z nazwy w jądrze, ale raczej z ich głównych i mniejszych liczb. Ponieważ nie wiem, jaki masz system operacyjny, wygodne było po prostu skopiowanie liczb z miejsca, w którym już wiemy. Jeśli zrobisz to z niewłaściwymi głównymi i małymi numerami, najprawdopodobniej zrobiłbyś inne urządzenie, być może dysk lub coś innego, do czego nie chcesz pisać.

Jozuego
źródło
4
Warto zauważyć, że to polecenie wymaga sudo(lub działa jako użytkownik root). Wyjaśnij (w swojej odpowiedzi), co rozumiesz przez „odpowiednie główne i mniejsze liczby deweloperów”.
mklement0
3
(Nie jestem OP.) Doceniam aktualizację, ale nadal jestem zdezorientowany, w jaki sposób „duże i mniejsze liczby” odnoszą się do ścieżki do pliku /dev/null, tak jak to zostało użyte w twoim poleceniu. I myślę, że to pomoże czytelnikom przyszłości notatki w swojej odpowiedzi , że sudojest to wymagane.
mklement0
1
@wallyk: Dzięki, to naprawdę dobrze wiedzieć. Ale chodzi mi o to: w jaki sposób wchodzi w grę w odniesieniu do cp -a /dev/null log.txtmoich komentarzy?
mklement0
1
@MALON: Rzeczywiście ty, a na Ubuntu 14.04 ty nie potrzebują sudodo wykonywania tego polecenia, chyba że zdarzy ci się być uruchomiony jako użytkownik root(który jest ogólnie zniechęca). Użycie sudo(lub uruchomienie jako root) do utworzenia twardego łącza (ta odpowiedź) lub dowiązania symbolicznego (odpowiedź @ V.Michel) może być jednak właściwym rozwiązaniem, jeśli plik musi zostać umieszczony w miejscu, do którego każde konto użytkownika może zapisać, ale chodzi o to: wyraźnie zwróć uwagę na to wymaganie.
mklement0
1
PS: Wiem, że główne, drobne komentarze prawdopodobnie dotyczą komentarza do pytania zalecającego użycie mknod. Zauważ, że komentarze zwykle nie zwracają uwagi, więc ktoś czytający tylko pytanie, a następnie twoja odpowiedź może być mylona (tak jak ja; zauważ również, że większość ludzi nigdy nie jest narażona na pojęcia takie jak główne i drobne numery urządzeń).
mklement0
65

Możesz utworzyć symboliczny link do / dev / null i nie musisz być rootem:

ln -s /dev/null log.txt
V. Michel
źródło
Ma to również tę zaletę, że jest samodokumentujące, ponieważ ls -l log.txtpokazuje, że jest to dowiązanie symboliczne do / dev / null, zamiast polegać na wiedzy, że np. „1, 3” jest w jakiś sposób znaczący.
Monty Harder
14

Inne odpowiedzi tutaj prawdopodobnie będą działać. W szczególności rozwiązanie dowiązania symbolicznego będzie prawdopodobnie najłatwiejszym rozwiązaniem. Oferuję to głównie dla kompletności.

Rozwiązania wymagające mknod(lub cp -a) stają się problematyczne, jeśli system plików zawierający plik nie obsługuje urządzeń (np. Został zamontowany z nodevopcją, na przykład). Oczywiście twarde łącza między systemami plików po prostu nie działają.

Alternatywą dla twardych dowiązań lub tworzenia nowych węzłów urządzeń jest użycie montowania powiązań, które pozwalają zamontować plik lub katalog z jednej części drzewa systemu plików na innej. Na przykład możesz uruchomić:

mount -o bind /dev/null /path/to/log.txt

Działa to jak twardy link, ale:

  • Może działać w różnych systemach plików (ponieważ nie jest oparty na i-węzłach systemu plików, takich jak twardy link)
  • Działa na systemach plików tylko do odczytu (ponieważ tak naprawdę nie modyfikujesz systemu plików)

Kompletny przykład:

bash-4.3# ls -l /var/log/boot.log
-rw-r--r--. 1 root root 7436 Dec 19 10:00 /var/log/boot.log
bash-4.3# mount -o bind /dev/null /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
bash-4.3# echo words words words > /var/log/boot.log
bash-4.3# ls -l /var/log/boot.log
crw-rw-rw-. 1 root root 1, 3 Dec 19 09:58 /var/log/boot.log
Larsks
źródło
Ale działa tylko w systemach, które mają zamontowane bindowanie. (Tak jak współczesny Linux.)
reinierpost
Plik dziennika i tak nie należałby do systemu plików tylko do odczytu.
Monty Harder
1
Zdziwiłbyś się, jak często chcesz pisać w jednym pliku w systemie plików tylko do odczytu. I może równie dobrze być w nodevsystemie plików.
larsks
6

Zależy to krytycznie od tego, JAK aplikacja obsługuje log.txt.

Jeśli aplikacja po prostu otworzy istniejący plik i zapisze w nim, to zgodnie z opisem w innych odpowiedziach możesz go dowiązać do / dev / null, dowiązać do niego gdzie indziej, dowiązać do niego gdzie indziej (chociaż dowiązań twardych nie można przenosić między systemami plików, więc nie ma t wiele rzeczy w tym), stwórz tam kopię węzła urządzenia / dev / null itp.

OTOH, jeśli aplikacja usunie i ponownie utworzy plik log.txt, żaden z nich nie zadziała. Mógłbyś symlinkować cały katalog gdzie indziej, aby przekierować zapisy do innego systemu plików, ale to o tym i musiałbyś poradzić sobie z innymi rzeczami w katalogu.

Sądzę, że jeśli naprawdę chciałeś, możesz stworzyć niestandardowy system plików nakładki, który przeszedłby przez większość operacji, jednocześnie odrzucając wszelkie próby utworzenia pliku o nazwie log.txt.

płyn do płukania
źródło
chattr +i log.txtza pierwszym razem, a aplikacja nie będzie już usuwać pliku.
Marco Marsala
3

Cóż, jedna niewdzięczna metoda z nazwaną rurą :

# create a named pipe
mkfifo /path/to/log.txt
# read contents from the pipe and redirect them to /dev/null
cat /path/to/log.txt > /dev/null

możesz prawie wszystko zrobić z zrzutem dziennika, takim jak filtrowanie lub wysyłanie przez nc .

użytkownik3824053
źródło
Jeśli catproces zostanie zabity lub ulegnie awarii, program logowania zawiesi się, gdy potok będzie pełny.
Marco Marsala
-1

Zastanów się, czy plik nie jest rzeczywistym urządzeniem. Plik „log.txt” utworzony za pomocą mknod, z odpowiednim typem pliku i tymi samymi liczbami mniejszymi i większymi, będzie działał jako urządzenie zerowe, ponieważ tak jest.

rackandboneman
źródło
Nie dodaje to nic do tego, co już powiedzieli inni.
Kusalananda