破碎的符号链接和神秘(删除)

时间:2014-06-04 14:04:42

标签: linux bash symlink procfs

我一直在使用linux上的proc文件系统,我已经遇到了一些我想澄清的行为。

/proc中的每个进程都有一个符号链接到它的可执行文件/proc/{pid}/exe。如果进程在删除可执行文件后继续运行,则读取此符号链接将返回可执行文件的路径,并在末尾附加(deleted)

运行此命令,您甚至可能会在系统上看到一些内容:

grep '(deleted)' <(for dir in $(ls /proc | grep -E '^[0-9]+'); do echo "$dir $(readlink /proc/$dir/exe)"; done)

我尝试使用一些简单的bash命令重新创建此行为:

>>> echo "temporary file" >> tmpfile.test
>>> ln -s tmpfile.test tmpfile.link
>>> rm tmpfile.test
>>> readlink tmpfile.link
tmpfile.test

名称后面没有(deleted)!尝试cat tmpfile.link确认链接已损坏(cat: tmpfile.link: No such file or directory)。

然而,前几天这个相同的测试导致(deleted)附加到readlink的输出。是什么给了什么?

以下是我想知道的事情:

  • 是否有一系列保证(deleted)的事件 附加到名称?
  • 为什么/proc/{pid}/exe显示(deleted)已删除的可执行文件?
  • 如何通过/proc/{pid}/exe获取可执行文件的名称 没有任何附加(deleted)并保证原件 可执行文件并未命名为some_executable (deleted)

2 个答案:

答案 0 :(得分:2)

它不是readlink,但是Linux会将符号链接更改为指向<filename> (deleted),即(deleted)会附加到链接的目标。

答案 1 :(得分:0)

FWIW,特殊的$('table').DataTable({ "bLengthChange": true, "Filter": true, "Info": true, "bSort": true, "bPaginate": false, "searchHighlight": true, "aoColumnDefs": [{ "bSortable": false, "aTargets": ["no-sort"] }], "dom": 'Bfrtip', "buttons": ['copy','csv','pdf','excel','print'], initComplete: function() { var buttons = $('.dt-buttons'); $('.dt-buttons').hide(); $('.dt-buttons').show(); $('div.panel-body').append(buttons); } }); 行为是在https://elixir.bootlin.com/linux/v4.1.13/source/fs/dcache.c#L3080的Linux内核函数<filename> (deleted)中实现的。

源注释(在下面的代码段中)建议特殊行为仅适用于为某些“合成文件系统”(例如d_path())和“伪索引节点”即时生成的名称(路径)。 / p>

procfs