如何不使用Ctrl + c退出“ tail -f”模式?


22

当我这样做时tail -f filename,如何退出模式而不用Ctrl+c杀死进程?

我想要的是一种正常的退出方式,例如q中的top

我只是对这个问题感到好奇,因为我觉得终止进程不是放弃某些事情的好方法。


23
tail不互动;它不接受命令。
muru

5
使用SIGTERM(默认)和SIGKILL杀死进程之间也存在差异。SIGTERM“询问”过程停止,该信号可由程序处理。另一方面,SIGKILL实际上终止了该过程。看到man signal更多
mrc02_kr

9
这个问题的前提是错误的。这特殊字符并不会在你所想“杀”的过程。它发出的中断信号给它,而不是杀死终止的信号。
JdeBP

6
完全tail不用中断就可以杀死它甚至杀死它是完全合理的。但是,如果你想要一个选择,考虑most,其中有一个公认的记录下“跟随”模式,使用Shift + F启动,并且可以干净地退出问
托比·斯佩特

4
这里的问题是您的感觉是“杀死进程不是退出某件事的好方法”-向进程发送^ C 说“我对您已经完成,并且希望您停止”的一种方式,这在Linux中退出终端进程的“默认”方式。如果您选择退出某个长期运行的过程,则选择停止该过程的后果可能会一团糟,但这tail -f不是:)
Josh

Answers:


46

正如评论中所说, Ctrl-C不会终止该tail过程,这是通过发送SIGTERM或SIGKILL信号(臭名昭著的-9...)完成的;它仅发送一个SIGINT,告知tail结束转发模式并退出。

仅供参考,这些是更好的工具:

less +F filename

less,您可以按Ctrl-C结束前进模式并滚动浏览文件,然后按F再次返回到前进模式。

请注意,less +F许多人都建议将其作为的更好替代tail -f。有关这两种工具之间的区别和警告,请阅读以下答案:“ tail -f”是否比“ less + F”更有效?


7
题外话。OP并未要求“结束转发模式并滚动浏览文件”。相反,OP询问如何在不使用Ctrl + C的情况下退出tail -f
fpmurphy

6
@ fpmurphy1鉴于OP的问题前提不正确(tail没有被CTRL-C杀死并且不是交互式的),我相信我的回答是适当的。
dr01

11
@ fpmurphy1如果从字面上看是OP,那是没有意义的,但是我更喜欢教育性的答案,以解决误解,同时给出OP 实际要实现的目标的答案,即真正的问题。
MarioDS

15
“ Ctrl-C不会终止尾进程” -是的。或至少一样kill <pid>。对于大多数程序,Ctrl-C(= SIGINTSIGTERM和某种程度上没有真正的区别SIGKILL。这三种方法的默认操作是简单地终止该进程,就像exit()已被调用一样,除了for之外SIGKILL,没有与之关联的用户模式代码exit()被调用(因此不进行atexit()清理等)。除非程序明确捕获其中任一者并对其执行操作,否则,Ctrl-Cand SIGTERM尤其是完全相同。GNU尾巴没有。
marcelm

4
@marcelm终止该过程与exit()调用该过程不同。exit()将运行atexit()处理程序,并清理打开的stdio文件(最重要的是刷新输出缓冲区)。一个SIGINT处理程序可以做到这一点,但大多数程序不打扰; 我不知道是否tail确实。
Barmar

14

我想要的是一种正常的退出方式,例如顶部的q。

那是ControlC:)

我只是对这个问题感到好奇,因为我觉得终止进程不是放弃某些事情的好方法。

^CControlC)将SIGINT发送到该进程,该SIGINT定义为:

当用户希望中断过程时,SIGINT信号由其控制终端发送给过程

这就是您要在这里执行的,是interrupt tail。没有其他方法可以完成您想做的事情(“轻而易举地”退出尾声),而其他答案提供了一种以tail其他方式停止的手段,但这并没有更好。

按下^C将尝试中断Linux中的任务-这是完全正常的,如果该过程处于某个中间并且您没有让它完成,那么这只是“不好”,然后是唯一的“不好”方面效果就是那个过程中剩下的东西。例如,^Cmake命令中间make保留部分编译的软件,但这很好:进一步运行将会清理/恢复中断的地方。


2
实际上,该make示例提醒我们为什么我们总是.DELETE_ON_ERROR:在Makefile中进行写入-我们希望Make在得知其中一个命令收到信号后才删除部分写入的中间文件。
Toby Speight

SIGINT如Toby的.DELETE_ON_ERROR:示例所示,进程可以在退出之前进行陷阱并进行清理。
暂停,直到另行通知。

1
是的,捕获SIGINT的能力正是我说这就是@Arthur想要的原因。不需要尾巴“不错”,用^C:) 不会伤害它的感觉:
乔什(Josh)


6

这可以解决您的问题,但不是一个特别令人满意的解决方案。

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

这将运行该命令15秒钟,然后为您杀死它,而无需按 ^C


5
是的,因此要关闭tail正在运行的计算机。不过,我猜你没看错。
亚伦

5
tail用SIGTERM 终止比用SIGINT终止更好?
德米特里·格里戈里耶夫

1
@DmitryGrigoryev你是完全正确的-它并不更好。但这实际上回答了OP的问题,尽管实际上并没有太多使用。但是,当我使用Dell DRAC Java应用程序时,需要使用超时来终止ping之类的操作,该应用程序需要菜单选项来按Control键,第二个菜单选项来释放控件(这很烦人,Dell c5220刀片式服务器)
Criggie

0

答案因上下文而异。要优雅地退出tail -f,您将需要一个触发器。假设您正在尝试监视将在某个时间点完成的任务的输出-可能会触发您。

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

我过去曾使用过类似的想法。

请享用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.