我知道Unix上有一个命令可以用来监视文件并查看正在写入的更改。这对于检查日志文件特别有用。

您知道它叫什么吗?

#1 楼

您是说

tail -f logfile.log


吗?

(尾巴的手册页)

评论


是的,这是实时的。

–亚当·吉本斯(Adam Gibbins)
09年4月30日在21:06

旁注:如果您的发行版提供了tailf命令,请优先使用tail -f。 tailf效率更高,因为如果未将其写入,则不需要访问受监视的文件(如果您在及时更新的情况下挂载了文件系统,则轮询访问会很烦人。)

– MihaiLimbăşan
09年5月2日在19:49

在超级用户处,我也找到了建议使用尾部-F而不是-f的答案

–拉法
2012-04-18 11:17



tail -F将跟随文件名而不是文件对象,这在日志文件轮换的情况下特别有用。

–阿米尔·阿里·阿克巴里(Amir Ali Akbari)
13年20月20日在7:19

几年后更新:不推荐使用tailf,并且tail -f是安全的。 (使用man tailf在系统上进行确认。)请参见文档:man7.org/linux/man-pages/man1/tailf.1.html

–exp1orer
17年8月1日在17:40

#2 楼

根据乔恩·斯基特(Jon Skeet)的回答,您可能是说尾巴。它允许您定期运行命令并查看全屏输出。例如:

watch -n 10 -d ls -l /var/adm/messages


将每10秒运行一次ls -l /var/adm/messages命令,并突出显示后续运行之间的输出差异。 (例如,用于观察日志文件的增长速度。)

#3 楼

如果要在每次更改文件(或目录中的任何文件)时运行命令,那么inotify-tools的inotifywait很有用。例如:

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done


评论


请注意,路径不是变量名的最佳选择。在zsh上,环境var似乎不区分大小写。对我来说,设置路径会使PATH也被设置,这基本上意味着在您修复该问题之前,将不会执行任何操作。在bash上,设置路径对PATH无效。

–Thanatos
19年6月17日在6:53



@Thanatos Zsh变量区分大小写,但是在Zsh本身设置的变量中,Zsh将* PATH变量“绑定”到同名但小写的数组。绑定变量始终由标量和数组(例如PATH和path)组成,修改其中的一个会修改另一个。一个关键功能是,数组版本会在标量版本(:)中的分隔符上自动拆分。自己打印“ $ PATH \ n $ path”。 zshparam(1)手册页中“外壳使用的参数”部分的第二段提供了更多详细信息。

–零骑士
20 Mar 10 '20在7:27

还要注意的是,Zsh使用了很多绑定的变量,而不仅仅是PATH和path。它们都在我之前的评论的部分中列出,包括但不限于:FPATH / fpath,CDPATH / cdpath,MANPATH / manpath,FIGNORE / fignore等。

–零骑士
20 Mar 10 '20 at 7:33

#4 楼

我更喜欢使用less +FG 1而不是tail -f,因为我发现自己需要在日志文件中搜索特定的错误或ID。如果需要搜索,请键入^C停止跟踪文件,然后键入?开始向后搜索。

键绑定与vi中的键绑定几乎相同。可以在启动时使用+选项初始化任何命令:

+cmd   Causes  the  specified  cmd  to be executed each time a new file is
       examined.  For example, +G causes less to  initially  display  each
       file starting at the end rather than the beginning.


对于很长的日志,我发现使用-n选项可以方便地关闭行号。来自联机帮助页:

-n or --line-numbers
          Suppresses line numbers.  The default (to use line numbers)  may
          cause  less  to run more slowly in some cases, especially with a
          very large input file.  Suppressing line  numbers  with  the  -n
          option  will  avoid this problem.  Using line numbers means: the
          line number will be displayed in the verbose prompt and in the =
          command,  and the v command will pass the current line number to
          the editor (see also  the  discussion  of  LESSEDIT  in  PROMPTS
          below).




1。给rgmarcha的提示在注释中指出。


评论


请记住为别名设置所需的选项,这样就不必每次都键入它们。

–迈克尔·汉普顿
2015年12月15日的1:48

实际上,在大多数情况下,通常应优先使用Shell函数而不是别名。

–tripleee
17-10-3在8:03

我想知道为什么+ FG而不是+ F?

–陆even
20年6月11日在15:11

#5 楼

尾巴很棒...也可以使用更少的开头来减少文件的开头,即更少的myfile然后按Shift + F。这少了作为尾巴。

评论


更少的+ F myfile也可以做到

–rgmarcha
09年6月4日在16:06

#6 楼

我正在编辑LaTeX文件,并希望监视它的中间位置是否有更改。我整理了以下对我有用的小shell脚本。我希望它也对其他人有用。

#!/bin/bash
FILE=""
CMD=""
LAST=`ls -l "$FILE"`
while true; do
  sleep 1
  NEW=`ls -l "$FILE"`
  if [ "$NEW" != "$LAST" ]; then
    "$CMD" "$FILE"
    LAST="$NEW"
  fi
done

将其另存为watch.sh并执行chmod u+x watch.sh。然后我按如下所示执行它:

./watch.sh file.tex pdflatex

如果只想在实际修改发生时才运行命令,则可以使用`md5sum "$FILE"`代替`ls -l "$FILE"`

评论


查看目录及其内容,而不是单个文件:NEW =`tree -sDct。 -我'ignore_pattern | another_pattern'`

–安迪
2013年12月19日下午14:34

#7 楼

您可以使用tailf命令最简单的命令

tailf logfile.log


#8 楼

您还可以使用inotifywatch / inotifywait钩入内核inotify子系统。这样,您还可以监视“打开”,“关闭”或“访问”之类的内容。

但是,如果您只是想将附加行添加到stdout,则我同意尾巴。

#9 楼

尾巴是标准的,传统的,随处可见的unix工具。一个更复杂的工具是multitail,它可以同时监视多个文件并突出显示语法。

#10 楼

如果除了尾部之外还希望在文件周围进行搜索,请使用“ F”命令少用。

使用tail时,请记住如果文件可能会翻转或被编辑替换(vim:w的默认模式)。

tail -f将导致tail存储文件描述符并遵循它。如果文件被替换,描述符将被更改。遵循文件描述符的好处是,如果文件被重命名,您仍然会遵循它。

---olol =将通过定期重新打开命名文件的尾部来查看它是否跟踪已被替换。

-重试是另一个有用的选项,如果您想要尾部日志文件但尚未创建该文件。

tail -F是一个--follow = --retry的快捷方式。

#11 楼

忘了tailf,diff是您想要的命令。
这是一个很好的技巧,可以观察2个文件之间或正在写入的一个文件之间的实时(或关闭)差异。

您可以使用这些方法以所需的任何方式修改行为,例如将更改写入文件以进行记录。在以下命令的监视间隔或其他选项中进行操作。

您有1个文件,并且要对其进行更改时要监视它:

所以这是什么要做的事情:



复制文件

cp file file2



编写bash脚本以查找差异,并更新file2

touch check-differences.sh
nano check-differences.sh
chmod 755 check-differences.sh



这是脚本的基本概念。如果需要,可以将其写入文件

 #!/bin/bash
diff file file2
cp file file2
 



下一个可以要么使用watch

watch ./check-differences




观看屏幕上的差异,默认情况下,此间隔每2秒更新一次。因此,如果需要返回并阅读它们,然后将diff的输出写入脚本中的文件。

#12 楼

虽然tail -f somefile.txt不断滚动显示新数据,但有时我还是更喜欢less +G somefile.txt来查看文件中的最新数据。

评论


我认为这已经涵盖了7年前的所有答案。

–卡巴斯德
16-11-25在21:47

#13 楼

我用它来执行文件更改时的某些功能:
sudo apt-get install inotify-hookable
inotify-hookable -w ./my_dir_to_monitor  -c "mkdir blabla"