Estaba tratando sedde reemplazar algunas palabras clave en un archivo grande (100 MB). No tenía conocimiento de la -iopción (in situ), así que mi primer intento fue redirigir así:
sed 's/original/edited/g' file.log >> file.log
Lo que sucedió después de eso fue que mi PC se detuvo, casi sin entrada de teclado. Probé una consola diferente Ctrl+ Alt+ F1pero después de ingresar lentamente el nombre de usuario, también se detuvo. Sin teclado, mi única opción era restablecer el hardware de la máquina. Después de iniciar sesión, vi que file.log tenía unos 8 GB.
Realmente me gustaría entender por qué la ejecución de ese comando pudo hacer que el sistema no respondiera tanto, y si existen mecanismos a nivel del sistema para activar alertas y matar el proceso ofensivo.
command-line
sed
cesarpachon
fuente
fuente

free -h?ex -sc '%s/original/edited/ge|x' file.logdebe hacer lo que quiera de forma idiomática UNIX sin lossed -iefectos secundarios.Respuestas:
Como ya se ha dicho, se
>>agrega al archivo, por lo que susedcomando se quedará allí leyendo las líneas que acaba de emitir y luego emitiéndolas un poco más. Si quisiera reemplazar su archivo en el lugar,>todavía no funcionaría, pero conocesedla-iopción, que definitivamente es la que desea.Sin embargo, si está absolutamente seguro de que desea agregar a un archivo que está leyendo como una secuencia, y solo desea hacer una pasada, considere usarlo
spongedesde elmoreutilspaquete;spongelee desde stdin en la memoria hasta EOF, luego volca todo su contenido en stdout, porsedlo que llegará al final del archivo, dejará de leerlo, lo cerrará y luego la esponja comenzará a agregarse a él.fuente
spongees una buena utilidad para conocer, perosedya tiene una-iopción:-i[SUFFIX], --in-place[=SUFFIX], edit files in place (makes backup if SUFFIX supplied).>>, que agrega, en lugar de>, que reemplaza. De acuerdo, OP había mencionado específicamente-ien la publicación y parece un caso de uso mucho más común que este, pero pensé que valía la pena señalar que la operación específica que OP había publicado era posible sin demasiadas fallas, si realmente Seguro que es lo que quieres hacer.sponge, échale un vistazovipe.moreutilses sólo un paquete mágico lleno de cosas que no sabías que necesitabasSu
sedcomando intentaba leer el archivo al que se estaba agregando. Nunca llegará al final del archivo, pero consumirá mucho tiempo de CPU en el intento. Es por eso que se inventó ^ C (interrumpir el proceso actual).fuente
Volver a agregar al archivo que leyó no es en ningún caso una buena idea, ya que terminará con un archivo cada vez mayor. Si realmente desea volver a escribir en el archivo, debe usar la
-ibandera:o si desea que cree una copia de seguridad antes de hacer cambios, puede agregar un sufijo de archivo al
-iindicador:Esto crearía un archivo llamado
file.log.baky luego haciendo cambios, lo que hiciste al intentar agregar al archivo que estás leyendo llamamos en la jerga del programador una carrera de datos, donde diferentes procesos compiten por la misma fuente de datos ya sea de entrada o salida . Esta es también la razón por la cual su máquina se detuvo.fuente
"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?"stracedel proceso completo en el otro lado no reprodujo el resultado y esto en mi máquina y en la máquina de otro usuario. Claro que hay un mecanismo con el que puede eliminar aplicaciones que no responden, pero si su máquina deja de responder, solo le queda una opción, reiniciarla. Todavía estoy probando esto y antes de no entender completamente qué está causando el comportamiento descrito, no puedo abordar esta parte de la pregunta.sedalmacenará todo en la memoria y luego lo cerrará, en lugar de mantener el control. Con un archivo de ~ 100 MB, como en OP, creció indefinidamente pero no bloqueó la máquina.