Próbowałem sed
zamienić niektóre słowa kluczowe w dużym pliku (100 MB). Nie wiedziałem o opcji -i
(na miejscu), więc moją pierwszą próbą było przekierowanie w następujący sposób:
sed 's/original/edited/g' file.log >> file.log
potem stało się, że mój komputer się zatrzymał, prawie bez klawiatury. Próbowałem innej konsoli Ctrl+ Alt+, F1ale po powolnym wprowadzeniu nazwy użytkownika również się zatrzymała. Bez klawiatury moją jedyną opcją było resetowanie sprzętowe urządzenia. Po zalogowaniu zobaczyłem, że plik file.log ma około 8 GB.
Naprawdę chciałbym zrozumieć, dlaczego wykonanie tego polecenia spowodowało, że system przestał reagować, a jeśli na poziomie systemu istnieją mechanizmy do wywoływania alertów i zabijania przestępców?
command-line
sed
cesarpachon
źródło
źródło
free -h
?ex -sc '%s/original/edited/ge|x' file.log
powinieneś robić to, co chcesz w idiomatyczny sposób w systemie UNIX bezsed -i
skutków ubocznych.Odpowiedzi:
Jak już powiedziano,
>>
dołącza się do pliku, więc twojesed
polecenie będzie tam siedzieć i czytać wiersze, które właśnie wypisał, a następnie wypisywać je jeszcze więcej. Jeśli chcesz zastąpić plik w miejscu,>
nadal nie będzie działać, ale jesteś świadomysed
„s-i
opcją, która jest zdecydowanie jeden chcesz.Jeśli jednak jesteś absolutnie pewien, że chcesz dołączyć do pliku, który czytasz jako strumień, i chcesz zrobić tylko jedno przejście tego, rozważ użycie
sponge
zmoreutils
pakietu;sponge
odczytuje ze standardowego wejścia do pamięci aż do EOF, a następnie zrzuca całą zawartość na standardowe wyjście, więcsed
uderzy w koniec pliku, przestanie go czytać, zamknie, a następnie zacznie się do niego dołączać gąbka.źródło
sponge
Jest to miłe narzędzie wiedzieć, alesed
już ma-i
opcję:-i[SUFFIX], --in-place[=SUFFIX], edit files in place (makes backup if SUFFIX supplied)
.>>
a nie>
zastępuje. To prawda, że OP wspomniał konkretnie-i
w poście i wydaje się, że jest to o wiele bardziej powszechny przypadek użycia niż ten, ale pomyślałem, że warto wskazać, że konkretna operacja, którą opublikował OP, była możliwa bez zbytniego zamieszania, jeśli naprawdę pewnie to właśnie chcesz zrobić.sponge
, spójrz navipe
.moreutils
to tylko magiczna paczka wypełniona rzeczami, o których nigdy nie wiedziałeś, że potrzebujeszTwoje
sed
polecenie próbowało odczytać plik, do którego się dołączało. Nigdy nie osiągnie końca pliku, ale zużyje dużo czasu procesora. Właśnie dlatego wynaleziono ^ C (proces przerywania prądu).źródło
Powrót do pliku, który odczytujesz, w żadnym wypadku nie jest dobrym pomysłem, ponieważ skończysz na stale rosnącym pliku. Jeśli naprawdę chcesz ponownie zapisać do pliku, powinieneś użyć
-i
flagi:lub jeśli chcesz utworzyć kopię zapasową przed wprowadzeniem zmian, możesz dodać sufiks pliku do
-i
flagi:Spowoduje to utworzenie pliku o nazwie,
file.log.bak
a następnie dokonanie zmian. To, co zrobiłeś, próbując dołączyć do pliku, który odczytujesz, wzywamy programistą do wyścigu danych, w którym różne procesy ścigają się dla tego samego źródła danych, czy to wejścia, czy wyjścia . Z tego powodu maszyna się zatrzymała.źródło
"I really would like to understand why the execution of that command was able to make the system so unresponsive, and if mechanisms exist at the system level to trigger alerts and kill the offending process?"
strace
Całego procesu po drugiej stronie didtn odtworzyć wynik i to na moim komputerze i na komputerze z innym użytkownikiem. Pewnie, że istnieje mechanizm, za pomocą którego możesz zabijać niereagujące aplikacje, ale jeśli twoja maszyna przestaje odpowiadać, pozostaje Ci tylko jedna opcja, resetowanie. Wciąż testuję to i zanim nie w pełni zrozumiem, co powoduje opisywane zachowanie, nie jestem w stanie odpowiedzieć na tę część pytania.sed
buforuje całą pamięć do pamięci, a następnie ją zamyka, zamiast trzymać uchwyt. Z plikiem ~ 100 MB, podobnie jak w OP, rozrastał się w nieskończoność, ale nie zepsuł maszyny.