我一直在使用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)
?答案 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