【问题标题】:How can I clear out data which was removed by rm -rf on a BusyBox based system without having to restart the system?如何在基于 BusyBox 的系统上清除 rm -rf 删除的数据,而无需重新启动系统?
【发布时间】:2019-11-22 02:30:27
【问题描述】:

我正在尝试创建一个 shell 脚本,以便为基于 busybox 的 Unix 系统轻松执行一些长命令。

系统没有lsof这样的命令,但有其他基本命令。我面临的问题是,当添加新功能时,我需要删除某些文件夹并使用adb push 将新文件夹推送到系统中。

当我这样做时,我收到一条错误消息,指出设备上没有剩余空间。所以我需要做一个电源循环。

我想知道在执行rm -rf 之后是否有任何方法可以删除数据而无需执行电源循环,即关闭重新启动

【问题讨论】:

    标签: shell unix memory-management busybox rm


    【解决方案1】:

    在基于 Linux 的系统上,文件占用的空间会被删除

    1. 该文件未被任何文件夹引用
    2. 文件未被任何进程打开

    “rm”将满足第一个条件,但是,您必须杀死所有打开文件的进程才能清除空间,否则,它只会在重新启动(电源循环)期间发生,当 fsck实用程序将识别未被任何文件夹引用的“孤立”索引节点。

    没有关于哪些进程持有打开句柄的信息。以下是一些通用的替代方案:

    • 如果有一个(或几个)进程使大文件保持打开状态,请尝试停止/重新启动这些服务。
    • 您可以在打开较大的文件之前将其截断,而不是使用“rm”。 'echo > large-file' 将释放所有文件空间。当然,这可能会对正在运行的进程产生负面影响,但从问题来看,这似乎不是问题。
    • 理论上,您可以使用“telinit”将busybox 从标准模式切换到不同的运行级别。如果服务配置为正确关闭,您可以让系统在重新启动后恢复,无需重启

    【讨论】:

    • 我确实尝试过 telinit,但没有奏效。至于停止仍然保持文件打开的服务,我将如何找到这些服务?系统没有lsof。
    • 我假设您对系统中运行的内容有所了解。在busybox (ps -ef) 上运行的进程是什么?另外,考虑安装 /proc(如果尚未安装),并查看 ls -l /proc/[0-9]*/fd/ 的输出
    • 我想我解决了这个问题。
    • @MathewThomas 为了 SO 读者的利益,你能分享你的解决方案吗?
    • 我需要验证解决方案是否正确,我尝试了两次它确实有效。我所做的不是很精通技术,但我使用文件夹创建了所有活动进程的列表,然后删除了文件夹,然后进行了电源循环,然后获取了活动进程列表。然后找出哪些都依赖于文件。
    猜你喜欢
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多