Comment quitter le mode `tail -f` sans utiliser` Ctrl + c`?


22

Quand je le fais tail -f filename, comment quitter le mode sans l'utiliser Ctrl+cpour tuer le processus?

Ce que je veux, c'est une façon normale d'arrêter, comme qdans top.

Je suis simplement curieux de la question, car je pense que tuer le processus n'est pas un bon moyen d'arrêter quelque chose.


23
tailn'est pas interactif; il ne prend pas de commandes.
muru

5
Il existe également une différence entre le processus de mise à mort avec SIGTERM (par défaut) et SIGKILL. Le processus «demande» de SIGTERM s'arrête et ce signal peut être géré par le programme. D'un autre côté, SIGKILL tue le processus. Voir man signalpour plus
mrc02_kr

9
La prémisse de cette question est erronée. Ce caractère spécial ne pas « tuer » le processus de la manière que vous pensez. Il lui envoie le signal d'interruption , pas les signaux de mise à mort ou d' arrêt .
JdeBP

6
Il est parfaitement raisonnable de l'interrompre tailou même de le tuer sans souci. Mais si vous voulez une alternative, envisagez most, qui a un mode "suivre" certes sous-documenté, initié avec Shift + F, et peut être proprement quitté avec Q.
Toby Speight

4
Le problème ici est votre perception que "tuer le processus n'est pas un bon moyen de quitter quelque chose" - envoyer ^ C à un processus est une façon de dire "j'en ai fini avec vous et j'aimerais que vous arrêtiez", il est le « défaut » jusqu'à la sortie d'un processus terminal dans Linux. Si vous choisissez de quitter un processus de longue haleine, les répercussions de votre choix de l'arrêter peuvent laisser un gâchis, mais ce tail -fn'est pas le cas :)
Josh

Réponses:


46

Comme dit dans les commentaires, Ctrl-Cne tue pas le tailprocessus, ce qui se fait en envoyant un signal SIGTERM ou SIGKILL (l'infâme -9...); il envoie simplement un SIGINT qui indique de tailmettre fin au mode avant et de quitter.

Pour info, c'est un meilleur outil:

less +F filename

Dans less, vous pouvez appuyer sur Ctrl-Cpour terminer le mode avant et faire défiler le fichier, puis appuyez sur Fpour revenir à nouveau en mode avant.

Notez que less +Fbeaucoup préconisent une meilleure alternative àtail -f . Pour la différence et les mises en garde entre les deux outils, lisez cette réponse: «tail -f» est-il plus efficace que «moins + F»?


7
Hors sujet. L'OP n'a pas demandé de "terminer le mode avant et de faire défiler le fichier". Le PO a plutôt demandé comment quitter tail -f sans utiliser Ctrl + C
fpmurphy

6
@ fpmurphy1 Étant donné que la prémisse de la question du PO est incorrecte ( tailn'est pas tuée par CTRL-C et n'est pas interactive), je pense que ma réponse est plus que appropriée.
dr01

11
@ fpmurphy1 Si vous prenez l'OP littéralement oui, c'est hors sujet, mais je préfère les réponses éducatives qui corrigent les malentendus et en même temps donnent une réponse à ce que l'OP essayait réellement de réaliser, c'est-à-dire la vraie question.
MarioDS

15
"Ctrl-C ne tue pas le processus de queue" - Oui, c'est le cas. Ou du moins autant kill <pid>. Pour la plupart des programmes, il n'y a pas de différence réelle entre Ctrl-C(= SIGINT), SIGTERMet, dans une certaine mesure, SIGKILL. L'action par défaut pour les trois est de simplement mettre fin au processus, comme s'il exit()avait été appelé, à l'exception du fait que pour SIGKILL, aucun du code de mode utilisateur associé à exit()n'est appelé (donc pas de atexit()nettoyage, etc.). Ctrl-Cet SIGTERM, en particulier, sont complètement identiques à moins que le programme ne les attrape explicitement et n'agisse en conséquence. La queue GNU ne le fait pas.
marcelm

4
@marcelm Mettre fin au processus n'est pas la même chose que d' exit()être appelé. exit()exécutera les atexit()gestionnaires et nettoiera les fichiers stdio ouverts (surtout le vidage des tampons de sortie). Un SIGINTgestionnaire pourrait le faire, mais la plupart des programmes ne dérangent pas; Je ne sais pas si tail.
Barmar

14

Ce que je veux, c'est une façon normale d'arrêter, comme q en haut.

C'est ControlC:)

Je suis simplement curieux de la question, car je pense que tuer le processus n'est pas un bon moyen d'arrêter quelque chose.

^C( ControlC) envoie un SIGINT au processus, qui est défini comme:

Le signal SIGINT est envoyé à un processus par son terminal de commande lorsqu'un utilisateur souhaite interrompre le processus

C'est exactement ce que vous voulez faire ici, c'est interrompre tail. Il n'y a pas d'autre moyen d'accomplir ce que vous essayez de faire (quitter "gentiment" la queue) et bien que d'autres réponses fournissent un moyen de s'arrêter tailautrement, elles ne sont pas meilleures.

Appuyer sur ^Ctentera d'interrompre une tâche sous Linux - c'est tout à fait normal, et ce n'est "pas bon" si ce processus est au milieu de quelque chose et que vous ne le laissez pas se terminer, et alors le seul côté "pas bon" l'effet est les restes de ce processus. Par exemple, ^Cau milieu d'une makecommande laisse un logiciel partiellement compilé, mais c'est très bien: une autre exécution de makenettoiera / reprendra là où elle s'était arrêtée.


2
En fait, l' makeexemple nous rappelle pourquoi nous écrivons toujours .DELETE_ON_ERROR:dans nos Makefiles - nous voulons que Make supprime les fichiers intermédiaires partiellement écrits quand il apprend qu'une de ses commandes a reçu un signal.
Toby Speight

Les processus peuvent piéger SIGINTet nettoyer avant de quitter, comme indiqué dans l' .DELETE_ON_ERROR:exemple de Toby .
pause jusqu'à nouvel ordre.

1
Oui, la capacité de piéger SIGINT est exactement la raison pour laquelle j'ai dit que c'est ce que veut @Arthur. Il n'est pas nécessaire d'être "gentil" à la queue, vous ne blesserez pas ses sentiments avec un ^C:)
Josh

12

tail -fnom de fichier, comment quitter le mode sans utiliser Ctrl cpour tuer le processus

Tu ne peux pas faire ça. Peut-être que tu voulais courirtail -f somefile | less

Le Ctrl cest interprété par le sous-système tty (et par votre shell) et envoie un SIGINTsignal (voir signal (7) et pty (7) ...). Voir tty démystifié .


6

Cela fonctionnerait et répondrait à votre question, mais ce n'est pas une solution particulièrement satisfaisante.

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

Cela exécutera la commande pendant 15 secondes puis la tuera sans avoir à appuyer sur ^C


5
Ouais, donc l'arrêt de l'ordinateur tailest exécuté. Pourtant, vous ne vous trompez pas, je suppose.
Aaron

5
En quoi la terminaison tailavec SIGTERM est-elle meilleure que la terminaison avec SIGINT?
Dmitry Grigoryev

1
@DmitryGrigoryev Vous avez tout à fait raison - ce n'est pas mieux. Mais cette réponse répond directement à la question du PO, même si ce n'est pas vraiment très utile en réalité. Cependant, j'ai utilisé le délai d'expiration pour mettre fin à des choses comme le ping, lors de l'utilisation d'une application Java Dell DRAC qui nécessite une sélection de menu pour appuyer sur Contrôle et un deuxième choix de menu pour libérer le contrôle (c'était juste irritant, une lame Dell c5220)
Criggie

0

Les réponses diffèrent selon le contexte. Pour quitter la queue -f avec élégance, vous aurez besoin d'un déclencheur. Supposons que vous essayez de surveiller la sortie d'une tâche qui se terminera à un moment donné - qui peut devenir votre déclencheur.

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

J'ai utilisé des idées similaires dans le passé.

Prendre plaisir.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.