如果 so 文件突然用 rm 删除,而相关进程还保持着 inode 的引用的情况下,还能正常运行多久? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
AllOfMe
V2EX    Linux

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

  •  
  •   AllOfMe 2018 年 7 月 16 日 4690 次点击
    这是一个创建于 2839 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    > 找 inode

    程序是不会去找 inode 的,只会找文件路径,所以是程序启动那一刻,文件路径所指向的文件。之后被删除了,又被新建了,都没关系。
    PythonAnswer
        12
    PythonAnswer  
       2018 年 7 月 17 日 via Android
    感谢楼上

    顺便问下,为什么叫句柄?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4850 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 90ms UTC 05:40 PVG 13:40 LAX 22:40 JFK 01:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86