Cuando lo hago tail -f filename, ¿cómo salir del modo sin usar Ctrl+cpara matar el proceso?
Lo que quiero es una forma normal de dejar de fumar, como qen top.
Solo tengo curiosidad acerca de la pregunta, porque siento que matar el proceso no es una buena manera de dejar algo.

tailno es interactivo; No toma comandos.man signalpara mástailo incluso matarlo sin preocuparse. Pero si desea una alternativa, consideremost, que tiene un modo de "seguimiento" admitidamente sub-documentado, iniciado con Shift + F, y que se puede salir limpiamente con Q.tail -fno es eso :)Respuestas:
Como se dijo en los comentarios, Ctrl-Cno mata el
tailproceso, que se realiza enviando una señal SIGTERM o SIGKILL (la infame-9...); simplemente envía un SIGINT que le indicatailque finalice el modo de avance y salga.FYI, esta es una mejor herramienta:
En
less, puede presionar Ctrl-Cpara finalizar el modo de avance y desplazarse por el archivo, luego presionar Fpara volver al modo de avance nuevamente.Tenga en cuenta que
less +Fes defendido por muchos como una mejor alternativa atail -f. Para ver la diferencia y las advertencias entre las dos herramientas, lea esta respuesta: ¿Es `tail -f` más eficiente que` less + F`?fuente
tailCTRL-C no la mata y no es interactiva), creo que mi respuesta es más que apropiada.kill <pid>hace. Para la mayoría de los programas, no hay ninguna diferencia real entreCtrl-C(=SIGINT),SIGTERMy, en cierta medida,SIGKILL. La acción predeterminada para los tres es simplemente finalizar el proceso, como si seexit()hubiera llamado, con la excepción de queSIGKILLnoexit()se llama a ninguno del código de modo de usuario asociado (por lo que no seatexit()realizan limpiezas, etc.).Ctrl-CySIGTERM, en particular, son completamente idénticos a menos que el programa los explique explícitamente y actúe en consecuencia. GNU tail no lo hace.exit()ser llamado.exit()ejecutará losatexit()controladores y limpiará los archivos stdio abiertos (lo más importante es que vaciará los búferes de salida). UnSIGINTcontrolador podría hacer esto, pero la mayoría de los programas no molestan; No sé si lotailhace.Eso es ControlC:)
^C( ControlC) envía un SIGINT al proceso, que se define como:Eso es exactamente lo que quieres hacer aquí, es interrumpir
tail. No hay otra manera de lograr lo que está tratando de hacer (dejar de fumar "muy bien") y si bien otras respuestas proporcionan un medio para detenersetailde otras maneras, no son mejores.Al presionar
^Cse intentará interrumpir una tarea en Linux: esto es perfectamente normal, y solo "no es bueno" si ese proceso está en el medio de algo y no lo está dejando terminar, y luego el único lado "no bueno" El efecto es lo que sobra de ese proceso. Como ejemplo,^Cen el medio de unmakecomando sale un software parcialmente compilado, pero está bien: una nueva ejecución demakelimpiará / reanudará donde lo dejó.fuente
makeejemplo es un recordatorio de por qué siempre escribimos.DELETE_ON_ERROR:en nuestros Makefiles: queremos que Make elimine los archivos intermedios parcialmente escritos cuando se entera de que uno de sus comandos recibió una señal.SIGINTy realizar la limpieza antes de salir como se indica en el.DELETE_ON_ERROR:ejemplo de Toby .^C:)No puedes hacer eso. Quizás quisiste correr
tail -f somefile | lessEl Ctrl ces interpretado por el subsistema tty (y por su shell) y envía una
SIGINTseñal (ver señal (7) y pty (7) ...). Ver tty desmitificado .fuente
Esto funcionaría y respondería a su pregunta, pero no es una solución particularmente satisfactoria.
Esto ejecutará el comando durante 15 segundos y luego lo matará por usted, sin tener que presionar
^Cfuente
tailse está ejecutando. Aún así, no te equivocas, supongo.tailmejor terminar con SIGTERM que terminar con SIGINT?Las respuestas difieren según el contexto. Para salir de la cola con elegancia, necesitará un gatillo. Suponga que está intentando monitorear la salida de una tarea que finalizará en algún momento, que puede convertirse en su desencadenante.
He usado ideas similares en el pasado.
Disfrutar.
fuente