web-dev-qa-db-fra.com

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

Quand je fais tail -f filename, comment quitter le mode sans utiliser Ctrl+c pour tuer le processus?

Ce que je veux, c'est une façon normale d'arrêter, comme q dans 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
Key Shang

Comme indiqué dans les commentaires, Ctrl-C ne tue pas le processus tail, ce qui se fait en envoyant un signal SIGTERM ou SIGKILL (l'infâme -9...); il envoie simplement un SIGINT qui indique à tail de mettre fin au mode avant et de quitter.

Pour info, c'est un meilleur outil:

less +F filename

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

Notez que less +F est préconisé par beaucoup comme 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` less + F`?

47
dr_

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 "joliment") et bien que d'autres réponses fournissent un moyen d'arrêter tail par d'autres moyens, elles ne sont pas meilleures.

Appuyez sur ^C tentera 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 "pas bon" effet secondaire est les restes de ce processus. Par exemple, ^C au milieu d'une commande make laisse un logiciel partiellement compilé, mais c'est très bien: une nouvelle exécution de make nettoiera/reprendra là où elle s'était arrêtée.

14
Josh

tail -f nom de fichier, comment quitter le mode sans utiliser Ctrl c tuer le processus

Tu ne peux pas faire ça. Peut-être que vous vouliez exécuter tail -f somefile | less

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

12

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

6
Criggie

Délivrance

echo tail -n 1 -f <filename>

fonctionne pour moi bien que je ne sois pas sûr à 100% qu'il termine le processus de queue.

0
Sterling Butters

Les réponses diffèrent selon le contexte. Pour quitter tail -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.

0
navjit.brar