Como sair do modo `tail -f` sem usar` Ctrl + c`?


22

Quando eu faço tail -f filename, como sair do modo sem usar Ctrl+cpara matar o processo?

O que eu quero é uma maneira normal de parar, como qno top.

Estou curioso sobre a questão, porque sinto que matar o processo não é uma boa maneira de sair de algo.


23
tailnão é interativo; não aceita comandos.
Muru

5
Também há diferença entre o processo de interrupção com o SIGTERM (padrão) e o SIGKILL. O SIGTERM 'pede' que o processo seja interrompido e esse sinal pode ser tratado por programa. Por outro lado, a SIGKILL realmente mata o processo. Veja man signalmais
mrc02_kr

9
A premissa desta pergunta está com defeito. Esse personagem especial não "mata" o processo da maneira que você está pensando. Ele envia o sinal de interrupção a ele, não a matar ou terminar sinais.
JdeBP

6
É perfeitamente razoável interrompê-lo tailou até matá-lo sem se preocupar. Mas se você quiser uma alternativa, considere most, que tem um reconhecidamente sob documentado "seguir" o modo, iniciado com Shift + F, e pode ser limpa terminou com Q.
Toby Speight

4
O problema aqui é a sua percepção de que "matar o processo não é uma boa maneira de parar algo" - enviar ^ C para um processo é uma maneira de dizer "eu terminei com você e gostaria que você parasse", que é o caminho "default" para sair de um processo de terminal no Linux. Se você está escolhendo para sair de algum processo de longa duração, as repercussões de sua escolha para pará-lo pode deixar uma bagunça, mas tail -fnão é isso :)
Josh

Respostas:


46

Como dito nos comentários, Ctrl-Cnão elimina o tailprocesso, o que é feito enviando um sinal SIGTERM ou SIGKILL (o infame -9...); apenas envia um SIGINT que diz tailpara terminar o modo de avanço e sair.

Para sua informação, esta é uma ferramenta melhor:

less +F filename

Em less, você pode pressionar Ctrl-Cpara finalizar o modo de encaminhamento e rolar o arquivo e pressionar Fpara voltar ao modo de encaminhamento novamente.

Note que less +Fé defendido por muitos como uma alternativa melhor paratail -f . Para diferenças e ressalvas entre as duas ferramentas, leia esta resposta: `tail -f` é mais eficiente que` less + F`?


7
Fora do assunto. O OP não pediu para "encerrar o modo de encaminhamento e rolar o arquivo". Em vez disso, o OP perguntou como parar tail -f sem usar Ctrl + C
fpmurphy

6
@ fpmurphy1 Dado que a premissa da pergunta do OP está incorreta ( tailnão é eliminada pelo CTRL-C e não é interativa), acredito que minha resposta seja mais do que apropriada.
dr01

11
@ fpmurphy1 Se você aceitar o OP literalmente, é fora de tópico, no entanto, prefiro respostas educacionais que abordem mal-entendidos e, ao mesmo tempo, responda o que o OP estava realmente tentando alcançar, ou seja, a pergunta real .
MarioDS 22/08/17

15
"Ctrl-C não mata o processo de cauda" - Sim, sim. Ou pelo menos tanto quanto kill <pid>faz. Para a maioria dos programas, não há diferença real entre Ctrl-C(= SIGINT) SIGTERMe, até certo ponto SIGKILL,. A ação padrão para todos os três é simplesmente encerrar o processo, como se exit()tivesse sido chamado, com a exceção de que para SIGKILLnenhum código do modo de usuário associado exit()é chamado (portanto, nenhuma atexit()limpeza, etc.). Ctrl-Ce SIGTERM, em particular, são completamente idênticos, a menos que o programa explique ou atue explicitamente. A cauda GNU não.
Marcelm 22/08

4
@marcelm Terminar o processo não é o mesmo que exit()ser chamado. exit()executará os atexit()manipuladores e limpará os arquivos stdio abertos (o mais importante é liberar os buffers de saída). Um SIGINTmanipulador poderia fazer isso, mas a maioria dos programas não se incomoda; Eu não sei se tailfaz.
Barmar

14

O que eu quero é uma maneira normal de sair, como q no topo.

Isso é ControlC:)

Estou curioso sobre a questão, porque sinto que matar o processo não é uma boa maneira de sair de algo.

^C( ControlC) envia um SIGINT para o processo, definido como:

O sinal SIGINT é enviado para um processo pelo seu terminal de controle quando um usuário deseja interromper o processo

Isso é exatamente o que você quer fazer aqui, é interromper tail. Não há outra maneira de realizar o que você está tentando fazer ("muito bem" saia da cauda) e, enquanto outras respostas fornecem um meio de parar tailde outras maneiras, elas não são melhores.

Pressionar ^Ctentará interromper uma tarefa no Linux - isso é perfeitamente normal e apenas "não é bom" se esse processo estiver no meio de algo e você não o deixar terminar, e então o único lado "não será bom" efeito é sobra coisas desse processo. Como exemplo, ^Cno meio de um makecomando, deixa o software parcialmente compilado, mas tudo bem: uma nova execução makelimpará / retomará o processo de onde parou.


2
Na verdade, o makeexemplo é um lembrete de por que sempre escrevemos .DELETE_ON_ERROR:em nossos Makefiles - queremos que o Make remova arquivos intermediários parcialmente escritos quando souber que um de seus comandos recebeu um sinal.
Toby Speight

Os processos podem interceptar SIGINTe fazer a limpeza antes da saída, conforme indicado no .DELETE_ON_ERROR:exemplo de Toby .
Pausado até novo aviso.

1
Sim, a capacidade de capturar o SIGINT é exatamente por que eu disse que é isso que o @Arthur quer. Não há necessidade de ser "agradável" à cauda, você não vai ferir É sentimentos com um ^C:)
Josh

12

tail -fnome do arquivo, como sair do modo sem usar Ctrl cpara interromper o processo

Você não pode fazer isso. Talvez você quisesse corrertail -f somefile | less

O Ctrl cé interpretado pelo subsistema tty (e pelo seu shell) e envia um SIGINTsinal (consulte sinal (7) e pty (7) ...). Veja tty desmistificado .


6

Isso funcionaria e responderia à sua pergunta, mas não é uma solução particularmente satisfatória.

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

Isso executará o comando por 15 segundos e o matará para você, sem precisar pressionar ^C


5
Sim, o desligamento do computador tailestá sendo executado. Ainda assim, você não está errado, eu acho.
Aaron

5
Como é tailmelhor terminar com o SIGTERM do que com o SIGINT?
Dmitry Grigoryev

1
@DmitryGrigoryev Você está totalmente certo - não é melhor. Mas essa resposta responde diretamente à pergunta do OP, embora não seja realmente muito útil na realidade. No entanto, usei o tempo limite para encerrar coisas como ping, ao usar um aplicativo Dell DRAC Java que requer uma seleção de menu para pressionar Control e uma segunda opção de menu para liberar o controle (que era apenas irritante, uma lâmina Dell c5220)
Criggie

0

As respostas diferem com base no contexto. Para sair tail -f elegantemente, você precisará de um gatilho. Suponha que você esteja tentando monitorar a saída de uma tarefa que será concluída em algum momento - que pode se tornar seu gatilho.

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

Eu usei idéias semelhantes no passado.

Apreciar.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.