热衷于将 EOF 写入文件,以停止任何拖尾进程

热衷于将 EOF 写入文件,以停止任何拖尾进程

我有多个进程拖尾一个文件,如何将 EOF 写入该文件以停止拖尾进程?

例如,

tail -F $HOME/somefile.log

它正在某处的某个终端运行,但不确定在哪里。如何将 EOF 写入日志文件,以便任何跟踪该文件的进程停止跟踪该文件?

在某些情况下,我会跟踪 fifo:

mkfifo fivel
tail -f fivel

我相信将 EOF 写入命名管道实际上可能会停止/杀死任何尾随 fifo 的进程,而将 EOF 写入常规文件可能不会停止尾随进程。

答案1

当在常规文件上使用 -f 运行时,tail 命令不会在 EOF 处退出。它明确等待更多数据。所以文件末尾已经有一个 EOF - 它只是不会导致 tail 退出,因为它不应该这样做。

唯一的办法就是杀掉尾巴。跑步

ps ax|grep tail

然后杀死在安装尾部进程中显示的进程ID。或者使用

pkill tail

杀死所有尾部进程。请小心使用此选项,因为您可能会杀死您不想杀死的进程。

答案2

对我来说这个才不是似乎是实现这一目标的正确方法。我认为您想要定位读取文件的尾部进程而不是文件本身。请考虑类似以下内容。

ps -ef | grep "[t]ail" | grep 'somefile.log' | tr -s ' ' | cut -d' ' -f2 | xargs kill
  1. ps -ef将显示系统上运行的所有进程。
  2. grep "[t]ail"将找到名称中包含 tail 的所有进程(不包括此 grep)。
  3. grep 'somefile.log'将从这些文件中找到名称中带有 somefile.log 的文件。
  4. tr -s ' '会将所有多个空格压缩为一个。
  5. cut -d' ' -f2将使用空格作为分隔符仅获取第二列,即 PID。
  6. xargs kill会杀死那个PID。

这将杀死读取该文件的任何尾部进程(除了一些奇怪的极端情况,例如名为 tailsomefile.log 的日志文件)。可能有一种更干净的方法来做到这一点,但这对我来说是第一个立即明显的解决方案。我已经测试过这可以在 Linux 上运行。

相关内容