¿Cómo salir del modo `tail -f` sin usar` Ctrl + c`?


22

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.


23
tailno es interactivo; No toma comandos.
muru

55
También hay diferencia entre el proceso de eliminación con SIGTERM (predeterminado) y SIGKILL. SIGTERM 'pide' que el proceso se detenga, y esta señal puede manejarse por programa. Por otro lado, SIGKILL realmente mata el proceso. Ver man signalpara más
mrc02_kr

99
La premisa de esta pregunta es defectuosa. Ese personaje especial no "mata" el proceso en la forma en que está pensando. Le envía la señal de interrupción , no las señales de matar o terminar .
JdeBP

66
Es perfectamente razonable interrumpirlo tailo incluso matarlo sin preocuparse. Pero si desea una alternativa, considere most, que tiene un modo de "seguimiento" admitidamente sub-documentado, iniciado con Shift + F, y que se puede salir limpiamente con Q.
Toby Speight

44
El problema aquí es su percepción de que "matar el proceso no es una buena manera de dejar algo": enviar ^ C a un proceso es una forma de decir "Ya terminé contigo y me gustaría que pares". que es la forma en "default" para salir de un proceso terminal en Linux. Si decide salir de algún proceso de larga duración, las repercusiones de su elección para detenerlo pueden dejar un desastre, pero tail -fno es eso :)
Josh

Respuestas:


46

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 indica tailque finalice el modo de avance y salga.

FYI, esta es una mejor herramienta:

less +F filename

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`?


77
Fuera de contexto. El OP no solicitó "finalizar el modo de avance y desplazarse por el archivo". Por el contrario, el OP preguntó cómo salir de la cola -f sin usar Ctrl + C
fpmurphy

66
@ fpmurphy1 Dado que la premisa de la pregunta del OP es incorrecta ( tailCTRL-C no la mata y no es interactiva), creo que mi respuesta es más que apropiada.
dr01

11
@ fpmurphy1 Si se toma el OP, literalmente, sí, es fuera de tema, sin embargo yo prefiero respuestas educativas que los malentendidos dirección y al mismo tiempo dar una respuesta a lo que el PO fue realmente tratando de lograr, es decir, la verdadera cuestión.
MarioDS

15
"Ctrl-C no mata el proceso de cola" - Sí lo hace. O al menos tanto como lo kill <pid>hace. Para la mayoría de los programas, no hay ninguna diferencia real entre Ctrl-C(= SIGINT), SIGTERMy, en cierta medida, SIGKILL. La acción predeterminada para los tres es simplemente finalizar el proceso, como si se exit()hubiera llamado, con la excepción de que SIGKILLno exit()se llama a ninguno del código de modo de usuario asociado (por lo que no se atexit()realizan limpiezas, etc.). Ctrl-Cy SIGTERM, 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.
marcelm

44
@marcelm Terminar el proceso no es lo mismo que exit()ser llamado. exit()ejecutará los atexit()controladores y limpiará los archivos stdio abiertos (lo más importante es que vaciará los búferes de salida). Un SIGINTcontrolador podría hacer esto, pero la mayoría de los programas no molestan; No sé si lo tailhace.
Barmar

14

Lo que quiero es una forma normal de dejar de fumar, como q en la parte superior.

Eso es ControlC:)

Solo tengo curiosidad acerca de la pregunta, porque siento que matar el proceso no es una buena manera de dejar algo.

^C( ControlC) envía un SIGINT al proceso, que se define como:

La señal SIGINT es enviada a un proceso por su terminal de control cuando un usuario desea interrumpir el proceso.

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 detenerse tailde 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 un makecomando sale un software parcialmente compilado, pero está bien: una nueva ejecución de makelimpiará / reanudará donde lo dejó.


2
En realidad, el 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.
Toby Speight

Los procesos pueden atrapar SIGINTy realizar la limpieza antes de salir como se indica en el .DELETE_ON_ERROR:ejemplo de Toby .
Pausado hasta nuevo aviso.

1
Sí, la capacidad de atrapar a SIGINT es exactamente por lo que dije que es lo que @Arthur quiere. No hay necesidad de ser "agradable" a la cola, no herirás sus sentimientos con un ^C:)
Josh

12

tail -fnombre de archivo, cómo salir del modo sin usar Ctrl cpara matar el proceso

No puedes hacer eso. Quizás quisiste corrertail -f somefile | less

El 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 .


6

Esto funcionaría y respondería a su pregunta, pero no es una solución particularmente satisfactoria.

timeout 15s tail -f /var/log/messages

Esto ejecutará el comando durante 15 segundos y luego lo matará por usted, sin tener que presionar ^C


55
Sí, así que apagar la computadora tailse está ejecutando. Aún así, no te equivocas, supongo.
Aaron

55
¿Cómo es tailmejor terminar con SIGTERM que terminar con SIGINT?
Dmitry Grigoryev

1
@DmitryGrigoryev Tienes toda la razón, no es mejor. Pero esta respuesta responde directamente a la pregunta del OP, a pesar de que en realidad no es de mucha utilidad. Sin embargo, he usado el tiempo de espera para terminar cosas como el ping, cuando uso una aplicación Java DRAC de Dell que requiere una selección de menú para presionar Control y una segunda opción de menú para liberar el control (eso fue irritante, un blade Dell c5220)
Criggie

0

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.

task >& filename.log &
task_pid=$!
tail -f filename.log &
tail_pid=$!
while [ 1 ]
do
    # -0 is a special "poke" signal - "are you around?"
    kill -0 $task_pid
    if [ $? -eq 0 ]
    then
        # Original task is still alive.
        sleep 2
        continue
    fi
    kill -TERM $tail_pid
    break
done

He usado ideas similares en el pasado.

Disfrutar.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.