V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
AllOfMe
V2EX  ›  Linux

如果 so 文件突然用 rm 删除,而相关进程还保持着 inode 的引用的情况下,还能正常运行多久?

  •  
  •   AllOfMe · 2018-07-16 11:56:25 +08:00 · 4189 次点击
    这是一个创建于 2083 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如说 /lib64 下的 so 文件,一下子被删除掉,尽管命令行用不了,也创建不了新进程,但是我发现原有的进程还能正常运行。经过 google,好象是 rm 并不能真正的删除掉数据,只有当进程不用了才会回收持有的 inode 再去引用新的 inode。
    所以我比较好奇,这个 rm 到引用新的 inode 这段时间里进程是否能正常工作?还有这段时间内 什么情况下会释放 inode ?如果释放 inode 引用之后再去找新 inode 找不到会直接崩溃吗?
    欢迎大家讨论一下^_^li

    第 1 条附言  ·  2018-07-16 18:13:38 +08:00
    进程可以不包括基础的 SSH,FTP,SAMBA 等,也可以包括 Mysql,Oracle,Java Tomcat 这些比较应用的进程。如果被删除之后,这些网络,IO,CPU 调度还能正常用吗?
    12 条回复    2018-07-17 14:22:13 +08:00
    lolizeppelin
        1
    lolizeppelin  
       2018-07-16 11:57:38 +08:00 via Android   ❤️ 1
    可以一直用 你可以从 proc 里把文件复制出来
    lolizeppelin
        2
    lolizeppelin  
       2018-07-16 11:58:35 +08:00 via Android   ❤️ 1
    原理和 gc 引用计数器差不多吧 没引用了就回收
    yuedingwangji
        3
    yuedingwangji  
       2018-07-16 13:18:09 +08:00 via Android
    @lolizeppelin 请问怎么拷贝
    hjc4869
        4
    hjc4869  
       2018-07-16 14:22:19 +08:00   ❤️ 1
    如果是 elf 导入的 dll 那么直到进程结束用的都是这个文件。如果是 dlopen,那么 dlclose 后可能会释放。看具体实现。
    hjc4869
        5
    hjc4869  
       2018-07-16 14:25:30 +08:00   ❤️ 2
    例如 glibc 在 dlclose 引用计数到 0 时会关闭文件,但是 musl 不会。
    iwtbauh
        6
    iwtbauh  
       2018-07-16 17:56:34 +08:00 via Android   ❤️ 1
    i_count 与 i_nlink 的区别
    现在知道为什么 Unix 操作系统上删除文件的系统调用叫 unlink 不叫 deletefile 了吧
    AllOfMe
        7
    AllOfMe  
    OP
       2018-07-16 18:12:22 +08:00
    @yuedingwangji 应该可以用 busybox,简单的 mv 和 cp 操作
    q397064399
        8
    q397064399  
       2018-07-16 18:12:56 +08:00   ❤️ 1
    /proc/PID/maps
    sampeng
        9
    sampeng  
       2018-07-16 23:12:53 +08:00 via iPhone
    看他什么时候饿死…唔
    tempdban
        10
    tempdban  
       2018-07-17 01:32:04 +08:00 via Android
    @hjc4869 学到了 musl,看了资料这东西猛的一逼。
    msg7086
        11
    msg7086  
       2018-07-17 02:22:18 +08:00   ❤️ 1
    程序在运行的时候,打开了文件句柄,所以文件是一直可用的。
    你删除文件,并不是删除的文件,而是删除的文件系统中对于文件的引用。
    文件一直在那,只不过 unlink 以后在任何目录中都没有对于这个文件的引用了而已。
    所以程序会正常运行一直到结束。

    unlink 以后影响的是下一个启动的程序,因为程序启动时依赖文件系统中的引用,而引用已经被删除了,所以新程序会无法启动。

    > 找 inode

    程序是不会去找 inode 的,只会找文件路径,所以是程序启动那一刻,文件路径所指向的文件。之后被删除了,又被新建了,都没关系。
    PythonAnswer
        12
    PythonAnswer  
       2018-07-17 14:22:13 +08:00 via Android
    感谢楼上

    顺便问下,为什么叫句柄?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5338 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 08:09 · PVG 16:09 · LAX 01:09 · JFK 04:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.