如何在不使用 `Ctrl+c` 的情况下退出 `tail -f` 模式?

Key*_*ang 29 tail

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

我想要的是一种正常的退出方式,比如qtop.

我只是对这个问题很好奇,因为我觉得杀死进程并不是退出某些东西的好方法。

dr_*_*dr_ 51

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

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

less +F filename
Run Code Online (Sandbox Code Playgroud)

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

请注意,less +F许多人提倡将其作为tail -f. 有关这两种工具之间的区别和注意事项,请阅读以下答案:“tail -f”比“less +F”更有效吗?

  • _“Ctrl-C 不会终止尾部进程”_ - 是的。或者至少和 `kill <pid>` 一样多。对于大多数程序来说,`Ctrl-C` (=`SIGINT`)、`SIGTERM` 和某种程度的`SIGKILL` 之间没有真正的区别。所有三个的默认操作是简单地终止进程,就好像已经调用了`exit()`,除了对于`SIGKILL`,与`exit()` 关联的用户模式代码都没有被调用(所以没有`atexit()`清理等)。尤其是`Ctrl-C` 和`SIGTERM` 是完全相同的,除非程序明确地捕获其中之一并对其进行操作。GNU 尾巴没有。 (15认同)
  • @fpmurphy1 如果你从字面上理解 OP 是的,它是题外话,但是我更喜欢解决误解的教育答案,同时回答 OP *实际上*试图实现的目标,即**真正的**问题. (12认同)
  • 题外话。OP 没有要求“结束前进模式并滚动文件”。相反,OP 询问如何在不使用 Ctrl+C 的情况下退出 tail -f (7认同)
  • @fpmurphy1 鉴于 OP 的问题前提不正确(`tail` 没有被 CTRL-C 杀死并且不是交互式的),我相信我的回答非常合适。 (6认同)
  • @marcelm 终止进程与调用 `exit()` 不同。`exit()` 将运行 `atexit()` 处理程序,并清理打开的 stdio 文件(最重要的是刷新输出缓冲区)。`SIGINT` 处理程序可以做到这一点,但大多数程序不会打扰;我不知道 `tail` 是否可以。 (4认同)
  • “*普通模式,您可以在其中上下滚动文件*”-这是我以前不知道的一些新版本的`tail`吗? (3认同)

Jos*_*osh 15

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

那是 ControlC:)

我只是对这个问题很好奇,因为我觉得杀死进程并不是退出某些东西的好方法。

^C( ControlC) 向进程发送SIGINT,其定义为:

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

这正是你想要在这里做的,就是 interrupt tail。没有其他方法可以完成您想要做的事情(“很好地”退出尾巴),而其他答案提供了一种以tail其他方式停止的方法,但它们也好不到哪儿去。

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

  • 实际上,`make` 示例提醒我们为什么我们总是在 Makefile 中写入 `.DELETE_ON_ERROR:` - 我们希望 Make 在得知其中一个命令收到信号时删除部分写入的中间文件。 (2认同)

Bas*_*tch 12

tail -f文件名,如何退出模式而不用Ctrl c杀死进程

你不能那样做。也许你想跑tail -f somefile | less

Ctrl c被tty子系统解释(和你的shell)和发送SIGINT信号(参见信号(7)PTY(7) ...)。见tty 揭秘


Cri*_*gie 6

这将起作用并回答您的问题,但不是一个特别令人满意的解决方案。

timeout 15s tail -f /var/log/messages
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,关闭正在运行的计算机 `tail` 也是如此。不过,我想你没有错。 (5认同)
  • 用 SIGTERM 终止 `tail` 如何比用 SIGINT 终止它更好? (5认同)