linux – 为什么我不能`tail -f / proc / $pid / fd / 1`?
我写了一个简单的脚本来回显它的PID:
#/bin/bash while true; do echo $$; sleep 0.5; done 我正在一个终端中运行所述脚本(它一遍又一遍地说3844)并尝试在另一个终端中拖尾文件描述符: $tail -f /proc/3844/fd/1 它不会在屏幕上打印任何内容并挂起,直到^ c.为什么? 此外,所有STD文件描述符(IN / OUT / ERR)链接到相同的pts: $ls -l /proc/3844/fd/ total 0 lrwx------ 1 mg mg 64 sie 29 13:42 0 -> /dev/pts/14 lrwx------ 1 mg mg 64 sie 29 13:42 1 -> /dev/pts/14 lrwx------ 1 mg mg 64 sie 29 13:42 2 -> /dev/pts/14 lr-x------ 1 mg mg 64 sie 29 13:42 254 -> /home/user/test.sh lrwx------ 1 mg mg 64 sie 29 13:42 255 -> /dev/pts/14 这是正常的吗? 运行Ubuntu GNOME 14.04. 如果您认为这个问题属于SO或SU而不是UL,请告诉我们. 解决方法
做一个尾巴-f,它解释了一切.有趣的部分:
13791 fstat(3,{st_mode=S_IFREG|0644,st_size=139,...}) = 0 13791 fstatfs(3,{...}) = 0 13791 inotify_init() = 4 13791 inotify_add_watch(4,"/path/to/file",IN_MODIFY|IN_ATTRIB|IN_DELETE_SELF|IN_MOVE_SELF) = 1 13791 fstat(3,...}) = 0 13791 read(4,0xd981c0,26) = -1 EINTR (Interrupted system call) 它能做什么?它为文件设置了一个inotify处理程序,然后等待该文件发生.如果内核通过此inotify处理程序说明尾部,则文件已更改(通常是附加),则tail 1)搜索2)读取更改3)将它们写出到屏幕. 系统上的/ proc / 3844 / fd / 1是/ dev / pts / 14的符号链接,它是一个字符设备.没有像“内存映射”这样的东西,可以通过它访问.因此,没有任何可以对inotify签名的更改,因为没有可以访问的磁盘或内存区域. 这个字符设备是一个虚拟终端,它实际上就像它是一个网络套接字一样工作.在此虚拟终端上运行的程序将连接到此设备(就像您远程登录到tcp端口一样),并编写他们想要写入的内容.还有更复杂的东西,例如锁定屏幕,终端控制序列等,这些通常由ioctl()调用处理. 我想,你想以某种方式观看虚拟终端.它可以在linux上完成,但它不是那么简单,它需要一些类似网络代理的功能,以及这些ioctl()调用的一些棘手的使用.但是有一些工具可以做到这一点. 目前我不记得了,哪个debian软件包有这个目标的工具,但是通过一些谷歌搜索你可能很容易找到. 扩展:正如@Jajesh在这里提到的(如果你给我一个给他一个),该工具被命名为watch. 扩展#2:@kelnos提到,一个简单的cat / dev / pts / 14也足够了.我试过了,是的,它有效,但不正确.我没有对此进行过多次实验,但在我看来,进入该虚拟终端的输出既可以用于cat命令,也可以用于其原始位置,而不会同时用于两者.但它不确定. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |