精华内容
下载资源
问答
  • 许多情况下,删除文件都可以恢复,比如在该文件有...这正是我们恢复仍在运行的进程中(具有PID)已删除文件所需要的东西。这里就是介绍我们如何做到这一点的。 假设你打开了一个压缩文件,之后你删除了这
    许多情况下,删除的文件都可以恢复,比如在该文件有活动的进程在操作它,并且目前被单个或多个用户使用时。在 Linux 系统中,每个当前正在运行的进程都会获得 ID,其被称之为进程标识符 “PID”,并将它们存放在 /proc 目录中。这正是我们恢复仍在运行的进程中(具有PID)已删除的文件所需要的东西。这里就是介绍我们如何做到这一点的。

    假设你打开了一个压缩文件,之后你删除了这个文件。为了演示目的,压缩文件称为 “opengapps.zip”,这将是之后我们将打开和删除的文件。

    计算原始文件的 MD5 哈希

    删除之前,我们将计算该文件的 MD5。这样我们可以将原来的 MD5 哈希值与恢复文件的 MD5 哈希进行比较。这个过程将保证我们恢复的压缩文件的完整性是一样的,它没有被破坏。

    md5sum opengapps.zip >> md5-opengapps.txt

    要显示文本文件的内容。

    cat md5-opengapps.txt
    86489b68b40d144f0e00a0ea8407f7c0 opengapps.zip

    检查压缩文件的 MD5 哈希值之后。我们将压缩文件保持打开(LCTT 译注:此处是使用 file-roller 这个图形界面的解压程序保持对该压缩文件的打开,其内置在 GNOME 环境中;在桌面环境中,使用桌面工具打开一个压缩包也能起到同样的作用。又及,本文举例不是很恰当,如果是删除了某个服务进程的已经打开的配置文件,那么这种恢复就很有意义),并将其删除。之后,我们将从文件的恢复过程开始,步骤如下:

    rm opengapps.zip

    删除文件的恢复过程
    正如我们前面提到的,运行的进程在 /proc 目录中。我们可以使用以下命令搜索该目录中需要的进程:

    由于我们已经知道文件名包括 .zip 扩展名,因此我们可以使用 .zip 扩展名进行搜索。它将限制输出结果并显示所需的进程。

    ps -axu | grep .zip
    m 13119 0.8 1.0 121788 30788 ? Sl 06:17 0:00 file-roller /home/m/Downloads/Compressed/opengapps.zip
    m 13164 0.0 0.0 5108 832 pts/20 S+ 06:18 0:00 grep --color=auto .zip

    然后我们将进入到包含 PID 13119 的目录并打开 fd 子目录。

    cd /proc/13119/fd

    fd (文件描述符)目录包含多个文件,包括我们需要恢复的文件。该文件以硬链接的方式链接到原始文件。 fd 目录中的所有文件都以数字链接到“文件名”。因此,要确定这些文件中的哪一个链接到该原始文件,我们将用详细列表选项列出 /fd 目录。

    ls -l
    total 0
    lr-x------ 1 m m 64 Jul 14 06:17 0 -> /dev/null
    lrwx------ 1 m m 64 Jul 14 06:17 1 -> socket:[26161]
    lrwx------ 1 m m 64 Jul 14 06:17 10 -> anon_inode:[eventfd]
    lr-x------ 1 m m 64 Jul 14 06:17 11 -> anon_inode:inotify
    lrwx------ 1 m m 64 Jul 14 06:17 12 -> socket:[5752671]
    lr-x------ 1 m m 64 Jul 14 06:17 13 -> /home/m/Downloads/Compressed/opengapps.zip (deleted)
    lrwx------ 1 m m 64 Jul 14 06:17 2 -> socket:[26161]
    lrwx------ 1 m m 64 Jul 14 06:17 3 -> anon_inode:[eventfd]
    lrwx------ 1 m m 64 Jul 14 06:17 4 -> anon_inode:[eventfd]
    lrwx------ 1 m m 64 Jul 14 06:17 5 -> socket:[5751361]
    lrwx------ 1 m m 64 Jul 14 06:17 6 -> anon_inode:[eventfd]
    lrwx------ 1 m m 64 Jul 14 06:17 7 -> anon_inode:[eventfd]
    lrwx------ 1 m m 64 Jul 14 06:17 8 -> socket:[5751363]
    lrwx------ 1 m m 64 Jul 14 06:17 9 -> socket:[5751365]

    正如你在终端输出中看到的,原始文件 “opengapps.zip” 已被删除,但它仍然链接到一个文件名 13,其进程 PID 13119。但是,我们仍然可以通过将链接的文件复制到安全的地方来恢复它。

    cp 13 /home/m/Downloads/Compressed

    文件复制后。我们将返回包含恢复文件的目录,并使用以下命令重命名它。

    mv 13 opengapps-recovered.zip

    计算恢复文件的 MD5 哈希
    由于我们已经恢复了该文件。让我们检查该文件的完整性,这只是为了确保文件没有损坏,并且和原来一样。早先我们保存了原始文件的 MD5 哈希值。

    md5sum opengapps-recovered.zip >> md5-opengapps.txt

    该命令将检查文件的 MD5 哈希值,并在文件中追加新恢复文件的 MD5 哈希值,以轻松比较两个 MD5 哈希值。

    可以显示文本文件的内容来比较原始文件和恢复文件的 MD5 哈希值。

    cat md5-opengapps.txt
    86489b68b40d144f0e00a0ea8407f7c0 opengapps.zip
    86489b68b40d144f0e00a0ea8407f7c0 opengapps-recovered.zip

    恢复文件的 MD5 哈希是一样的。所以,我们成功地恢复了我们以前删除的文件,并且恢复后文件完整性一致,并且工作正常。

    注意: 在某些情况下,某些文件无法通过 ps -axu 命令看到。 所以,尝试检查运行的程序,并从中恢复文件。

    假设我们有一个使用 Totem 媒体播放器播放中的以 .avi 为扩展名的视频。你需要做的就是检查 Totem 的 PID,并按照本示例中提到的相同说明进行操作。

    要查找正在运行的程序的 PID,请使用以下命令,后面跟程序的名称。

    pidof 程序名

    本文地址:http://www.linuxprobe.com/linux-deleted-file.html

    展开全文
  • nginx运行过程中删除log文件无效

    千次阅读 2016-05-12 14:16:28
    场景服务器空间快爆了,连把日志压缩的空间都没有了。...解决猜测肯能是Nginx运行着,这个文件句柄一直处于打开状态没有关闭,因此系统把目录下的文件所有删除了,但是真正的文件因为有连接的存在还

    场景

    服务器空间快爆了,连把日志压缩的空间都没有了。只有把日志删除了。

    但是可怕的事,明明都/bin/rm *.log了,而且ls -a都看不见文件了,但是df看到磁盘空间就是不变大。而且试图写文件也失败,看来磁盘空间真的没有被释放!

    但是明明目录下已经没有日志文件了啊?

    解决

    猜测可能是Nginx运行着,这个文件句柄一直处于打开状态没有关闭,因此系统把目录下的文件索引删除了,但是真正的文件因为有连接的存在还没有删除。

    于是nginx -s stop , 再df一下,发现空间立刻释放了。

    展开全文
  • dd过程中删除生成文件的背后

    千次阅读 2013-10-17 20:18:02
    现象: dd的大文件,手动删除了生成的文件。但是dd程序还在继续跑。虽然生成的大文件没有了,但是磁盘使用率一直在提高。 final: 这时候需要停止大文件的写入,需要做的就是kill进程号为 27160。

    现象: dd的大文件,手动删除了生成的文件。但是dd程序还在继续跑。虽然生成的大文件没有了,但是磁盘使用率一直在提高。



    处理:


    这时候需要停止大文件的写入,需要做的就是kill进程号为 27160,当然有必要的话,需要查看一下这个进程号对应的进程。

    展开全文
  • linux 文件删除过程浅析

    千次阅读 2016-05-14 17:43:54
    Linux是通过link的数量控制文件删除的,只有当文件不存在任何链接时,该文件才会被删除,一般每个文件有两个link计数器: i_count 和 i_nlink,从VFS inode结构体可以找到: struct inode {struct hlist_node i_...

    1.Linux文件删除原理

    Linux是通过link的数量控制文件删除的,只有当文件不存在任何链接时,该文件才会被删除,一般每个文件有两个link计数器: i_count 和 i_nlink,从VFS inode结构体中可以找到:

     
    struct inode {
    struct hlist_node i_hash; /* hash链表的指针 */
    struct list_head i_list; /* backing dev IO list */
    struct list_head i_sb_list; /* 超级块的inode链表 */
    struct list_head i_dentry; /* 引用inode的目录项对象链表头 */
    unsigned long i_ino; /* 索引节点号 */
    atomic_t i_count; /* 引用计数器 */
    unsigned int i_nlink; /* 硬链接数目 */
    ...

    i_count: 引用计数器,文件被一进程引用,i_count数增加 ,可以认为是当前文件使用者的数量; 
    i_nlink: 硬链接数目(可以理解为磁盘的引用计数器),创建硬链接对应的 i_nlink 就会增加

    对于rm命令来说,实际就是减少磁盘的引用计数 i_nlink 。如果当文件被另外一个进程调用时,用户执行rm命令删除文件,再去cat文件内容时就会找不到文件,但是调用该删除文件的那个进程却仍然可以对文件进行正常的操作。这就是因为 i_nlink 为 0 ,但 i_count 并不为 0 。只有当 i_nlink 和 i_count 均为 0 时,文件才会被删除(这里的删除是指将文件名到 inode 的链接删除了,但文件在磁盘上的block数据块并未被删除)。

    首先使用strace追踪rm命令,看看rm具体使用了哪些系统调用:

     
    [root@ty ~]# strace rm test
    execve("/bin/rm", ["rm", "test"], [/* 19 vars */]) = 0
    brk(0) = 0x175c000
    mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f1365a2f000
    access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
    open("/etc/ld.so.cache", O_RDONLY) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=62329, ...}) = 0
    mmap(NULL, 62329, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f1365a1f000
    close(3) = 0
    open("/lib64/libc.so.6", O_RDONLY) = 3
    read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360\355\201\2160\0\0\0"..., 832) = 832
    fstat(3, {st_mode=S_IFREG|0755, st_size=1922152, ...}) = 0
    ... ...
    brk(0) = 0x175c000
    brk(0x177d000) = 0x177d000
    open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=99158576, ...}) = 0
    mmap(NULL, 99158576, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f135fb8b000
    close(3) = 0
    ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
    newfstatat(AT_FDCWD, "test", {st_mode=S_IFREG|0644, st_size=0, ...}, AT_SYMLINK_NOFOLLOW) = 0
    geteuid() = 0
    unlinkat(AT_FDCWD, "test", 0) = 0
    close(0) = 0
    close(1) = 0
    close(2) = 0
    exit_group(0) = ?

    由上发现最终调用unlinkat系统调用删除文件。 

    2.系统调用unlinkat

    unistd.h、unistd_64.h、unistd_32.h中定义系统调用号

     
    #define __NR_link 9
    #define __NR_unlink 10
    ...
    #define __NR_unlinkat 456

    两个函数定义在 Namei.c 文件中,如下:

     
    SYSCALL_DEFINE3(unlinkat, int, dfd, const char __user *, pathname, int, flag)
    {
    if ((flag & ~AT_REMOVEDIR) != 0)
    return -EINVAL;
     
    if (flag & AT_REMOVEDIR)
    return do_rmdir(dfd, pathname);
     
    return do_unlinkat(dfd, pathname);
    }
     
    SYSCALL_DEFINE1(unlink, const char __user *, pathname)
    {
    return do_unlinkat(AT_FDCWD, pathname);
    }

    在unlinkat函数定义中会判断flag标志,如果有设置AT_REMOVEDIR标志,说明删除的是目录则调用do_rmdir函数,否则调用do_unlinkat函数删除一个文件。

    3.do_unlinkat函数

     
    /*
    * 确保文件的实际截断发生在其目录的i_mutex之外,如果有很多写操作发生截断需要很长时间
    * 在等待I/O发生时,我们不想阻止目录的访问
    */
    static long do_unlinkat(int dfd, const char __user *pathname)
    {
    int error;
    char *name;
    struct dentry *dentry;
    struct nameidata nd;
    struct inode *inode = NULL;
     
    error = user_path_parent(dfd, pathname, &nd, &name); /* 获取父目录信息,成功保存在nd结构体中,并返回0*/
    if (error)
    return error;
     
    error = -EISDIR;
    if (nd.last_type != LAST_NORM) /*路径名中最后一个分量类型不是一个普通文件名*/
    goto exit1;
     
    nd.flags &= ~LOOKUP_PARENT; /*清除LOOKUP_PARENT标志*/
     
    mutex_lock_nested(&nd.path.dentry->d_inode->i_mutex, I_MUTEX_PARENT);
    dentry = lookup_hash(&nd); /*返回要删除文件的dentry结构*/
    error = PTR_ERR(dentry);
    if (!IS_ERR(dentry)) {
    /* Why not before? Because we want correct error value */
    if (nd.last.name[nd.last.len]) /*last域代表路径名中的最后一个分量,在LOOKUP_PARENT标志设置时使用,因为上边已经做了清除标志操作,此处这样做可以判断是否清除成功,否的话,返回正确的错误码*/
    goto slashes;
    inode = dentry->d_inode;
    if (inode)
    atomic_inc(&inode->i_count); /*i_count引用计数器(文件当前使用者的数量)原子的加1*/
    error = mnt_want_write(nd.path.mnt); /*判断mnt对象是否有可写权限,是返回0*/
    if (error)
    goto exit2;
    error = security_path_unlink(&nd.path, dentry); /*检查权限允许删除一个到文件的硬链接,调用path_unlink是一个函数指针(如果有定义)*/
    if (error)
    goto exit3;
    error = vfs_unlink(nd.path.dentry->d_inode, dentry);
    exit3:
    mnt_drop_write(nd.path.mnt);
    exit2:
    dput(dentry); /*释放dentry结构体,并释放资源*/
    }
    mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
    if (inode)
    iput(inode); /* truncate the inode here */
    exit1:
    path_put(&nd.path); /*释放引用的一个path结构体*/
    putname(name); /*释放name*/
    return error;
     
    slashes:
    error = !dentry->d_inode ? -ENOENT :
    S_ISDIR(dentry->d_inode->i_mode) ? -EISDIR : -ENOTDIR;
    goto exit2;
    }

    主要分为以下几个步骤:

     
    (1) error = user_path_parent(dfd, pathname, &nd, &name);
    (2) dentry = lookup_hash(&nd);
    (3) atomic_inc(&inode->i_count);
    (4) vfs_unlink(nd.dentry->d_inode, dentry);
    (5) dput(dentry);
    (6) iput(inode); /* truncate the inode here */

    该函数中首先使用user_path_parent()函数获取要删除文件的父目录信息,成功会返回0,并且将父目录信息保存在nameidata类型的结构体nd中,然后通过lookup_hash函数在当前目录中找寻要删除文件的目录项信息,if语句判断获取的dentry是否有错误,有错误就使用path_put()和putname()释放前几步获取到的数据,然后返回,结束;若没有错误,得到该文件的inode,增加其i_count进程引用计数,判断当前挂载点是否有可写权限,有可写权限就调用vfs_unlink函数执行文件dentry的删除,释放dentry结构体,并释放资源,最后调用iput函数截断inode。

    3.1 vfs_unlink函数

     
    int vfs_unlink(struct inode *dir, struct dentry *dentry) /*删除dentry,即就是硬链接*/
    {
    int error = may_delete(dir, dentry, 0); /*权限检查,是否有删除权限*/
     
    if (error)
    return error;
     
    if (!dir->i_op->unlink)
    return -EPERM;
     
    vfs_dq_init(dir);
     
    mutex_lock(&dentry->d_inode->i_mutex);
    if (d_mountpoint(dentry))
    error = -EBUSY;
    else {
    error = security_inode_unlink(dir, dentry);
    if (!error)
    error = dir->i_op->unlink(dir, dentry); /*调用具体文件系统的unlink函数,如ext3_unlink()*/
    }
    mutex_unlock(&dentry->d_inode->i_mutex);
     
    /* We don't d_delete() NFS sillyrenamed files--they still exist. */
    if (!error && !(dentry->d_flags & DCACHE_NFSFS_RENAMED)) {
    fsnotify_link_count(dentry->d_inode);
    d_delete(dentry); /* 若dentry的使用计数为 1,说明没有其他进程引用该dentry,就尝试把该dentry的inode删除 */
    }
    return error;
    }

    在vfs_unlink()函数中会调用具体文件系统的删除函数。首先检查要删除文件所在目录的权限,判断是否有删除权限,有删除权限,然后判断具体文件系统是否还有定义自己的unlink函数,没有就退出vfs_unlink函数,否则调用具体文件系统unlink函数(如ext3_unlink()函数)。

    3.2 ext3_unlink函数

     
    static int ext3_unlink(struct inode * dir, struct dentry *dentry)
    {
    int retval;
    struct inode * inode;
    struct buffer_head * bh;
    struct ext3_dir_entry_2 * de;
    handle_t *handle;
    ......
    bh = ext3_find_entry(dir, &dentry->d_name, &de); /*返回该inode对应的buffer_head,并填充其ext3_dir_entry_2结构体*/
    if (!bh)
    goto end_unlink;
     
    inode = dentry->d_inode;
     
    retval = -EIO;
    if (le32_to_cpu(de->inode) != inode->i_ino)
    goto end_unlink;
    ......
    retval = ext3_delete_entry(handle, dir, de, bh); /*从该文件父目录中删除该文件目录项*/
    if (retval)
    goto end_unlink;
    dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
    ext3_update_dx_flag(dir);
    ext3_mark_inode_dirty(handle, dir);
     
    /*drop_nlink()将i_nlink数减1 */
    drop_nlink(inode);
    /*
    * 如果i_nlink为0,说明该inode再也没有任何dentry引用它了(即就是硬链接数位0)
    * 则认为当前节点为孤儿节点(准备删除的inode),加入到orphan inode链表中*/
    */
    if (!inode->i_nlink)
    ext3_orphan_add(handle, inode);
    inode->i_ctime = dir->i_ctime; /*更新修改索引节点的时间*/
    ext3_mark_inode_dirty(handle, inode);
    retval = 0;
     
    end_unlink:
    ext3_journal_stop(handle);
    brelse (bh);
    return retval;
    }

    该函数中最主要的操作是ext3_delete_entry函数,从该文件父目录中删除文件目录项,然后修改父目录的i_ctime(上次修改文件)和i_mtime(上次写文件)字段。然后将该文件inode 的硬链接计数减一后若为0,就将其添加到orphan inode(孤儿链表,后边介绍)链表中,更新该inode的修改时间。

    3.3 dput函数(release a dentry)

     
    void dput(struct dentry *dentry)
    {
    if (!dentry)
    return;
     
    repeat:
    if (atomic_read(&dentry->d_count) == 1)
    might_sleep(); /*提醒用户调用该函数的函数可能会sleep*/
     
    /*
    * 将d_count原子的减1,并同时对dcache_lock进行加锁,若d_count减1后仍非0,则直接返回return
    * 这块就是判断d_count个数,如果此时d_count大于1,存在多个引用就不能释放该dentry,直接返回;
    * 若为1,则可以删除dentry,继续后边的释放语句
    **/
    if (!atomic_dec_and_lock(&dentry->d_count, &dcache_lock))
    return;
     
    spin_lock(&dentry->d_lock); /*上一步对dentry->d_count递减,此处加锁,防止其他进程进行操作*/
    if (atomic_read(&dentry->d_count)) { /**/
    spin_unlock(&dentry->d_lock);
    spin_unlock(&dcache_lock);
    return;
    }
     
    /*
    * AV: ->d_delete() is _NOT_ allowed to block now.
    *
    */
    /*
    * 判断具体文件系统是否定义了d_op->d_delete接口函数,
    * ext2、ext3没定义,NFS有定义该接口函数,但没什么实质内容,基本是直接返回;
    * 若定义该接口函数则调用__d_drop()函数,把dentry从哈希链上移除,再调用dentry_iput函数尝试删除inode
    */
    if (dentry->d_op && dentry->d_op->d_delete) {
    if (dentry->d_op->d_delete(dentry))
    goto unhash_it;
    }
    /* Unreachable? Get rid of it */
    if (d_unhashed(dentry)) /*dentry从dcache hash链上移除了,表示该元数据对应的对象已经被删除,此时可以释放该元数据*/
    goto kill_it;
    if (list_empty(&dentry->d_lru)) { /*没有从dcache哈希链移除,表示该元数据对应的对象没有被删除,这时把dentry挂到LRU队列dentry_unused上*/
    dentry->d_flags |= DCACHE_REFERENCED;
    dentry_lru_add(dentry);
    }
    spin_unlock(&dentry->d_lock);
    spin_unlock(&dcache_lock);
    return;
     
    unhash_it:
    __d_drop(dentry);
    kill_it:
    /* if dentry was on the d_lru list delete it from there */
    dentry_lru_del(dentry);
    dentry = d_kill(dentry); /*删除该dentry,返回父目录项*/
    if (dentry)
    goto repeat;
    }

    dput函数的主要功能是释放一个dentry结构体,并且将该结构体的使用计数d_count的值减1操作,将该结构体从队列中删除,同时,释放该结构体的资源,无返回值。 
    函数中出现repeat字段,每次释放一个dentry,都要获取其父目录项,然后又跳转到dput()开头,继续对父目录dentry进行释放操作;是因为:每次创建一个dentry结构,除了增加自身的使用计数外,还会增加其父目录dentry的使用计数,所以当释放了一个dentry后也需要递减其父目录dentry的使用计数。才能保证父目录为空时能够被释放。

    4.iput函数(truncate the inode here)

     
    void iput(struct inode *inode)
    {
    if (inode) {
    BUG_ON(inode->i_state == I_CLEAR);
     
    if (atomic_dec_and_lock(&inode->i_count, &inode_lock))
    iput_final(inode);
    }
    }

    atomic_dec_and_lock宏先对i_count(进程使用计数)加锁后原子的减一,结果为0时,返回true,再进行调用iput_final函数进行删除操作,否则不进行任何操作。

    4.1 iput_final函数

     
    static inline void iput_final(struct inode *inode)
    {
    const struct super_operations *op = inode->i_sb->s_op;
    void (*drop)(struct inode *) = generic_drop_inode;
     
    if (op && op->drop_inode)
    drop = op->drop_inode;
    drop(inode);
    }

    该函数主要是调用generic_drop_inode()函数,其会判断inode->i_nlink的值,若为0,则该inode可以被删除,调用generic_delete_inode()实现。

     
    void generic_drop_inode(struct inode *inode)
    {
    if (!inode->i_nlink) /*i_nlink硬链接数为 0,删除 */
    generic_delete_inode(inode);
    else /* 不为 0 ,不能删除*/
    generic_forget_inode(inode);
    }

    在generic_delete_inode()函数中会判断是否定义具体文件系统的超级块操作函数delete_inode,若定义的就调用具体的inode删除函数(如ext3_delete_inode ),否则调用truncate_inode_pages和clear_inode函数(在具体文件系统的delete_inode函数中也必须调用这两个函数)。

    4.2 ext3_delete_inode 函数

     
    void ext3_delete_inode (struct inode * inode)
    {
    handle_t *handle;
    truncate_inode_pages(&inode->i_data, 0);
     
    if (is_bad_inode(inode))
    goto no_delete;
     
    handle = start_transaction(inode);
    if (IS_ERR(handle)) {
    /* 如果我们要跳过正常清理,我们仍然需要确保内核孤儿链表进行适当的清理。*/
    ext3_orphan_del(NULL, inode);
    goto no_delete;
    }
     
    if (IS_SYNC(inode))
    handle->h_sync = 1;
    inode->i_size = 0; /*将索引节点中记录的文件大小设置为0*/
    if (inode->i_blocks)
    ext3_truncate(inode); /*将索引节点中的文件占用块数清除*/
     
    ext3_orphan_del(handle, inode);
    EXT3_I(inode)->i_dtime = get_seconds(); /*修改该文件索引节点中的删除时间*/
     
    if (ext3_mark_inode_dirty(handle, inode))
    /* If that failed, just do the required in-core inode clear. */
    clear_inode(inode);
    else
    ext3_free_inode(handle, inode);
    ext3_journal_stop(handle);
    return;
    no_delete:
    clear_inode(inode); /* We must guarantee clearing of inode... */
    }

    该函数会删除指定的inode,其中主要会调用如下函数(还没看完):

    • ext3_truncate 截断磁盘上的索引信息
    • ext3_orphan_del
    • ext3_free_inode 从内存中和磁盘上分别删除该inode

    展开全文
  • 引子在项目开发过程中,总需要从一台电脑上转移代码到另一台电脑上,但是VS的项目动辄好几百M,而这些文件并不是都需要的。那么为了最小文件大小,又可以在另外一台电脑上顺利编译项目,需要携带或者说需要删除项目...
  • 操作无法完成 因为文件已在 Java(TM) Platform SE binary 打开。...删除进程占用的文件,可以先判断文件是否被删除,如果没有,则让系统强制回收资源,进行文件删除,示例如下: System.gc...
  • 总是会遇到当前文件正在被使用,请关闭后重试的问题,一种情况是当前应用或文件正在窗口打开,另一种情况就是即使应用程序没有执行,任务管理器也没有该应用的进程,重启还是会遇到提示无法删除。大多数时候是...
  • Linux系统恢复删除文件的方法

    千次阅读 2013-11-28 13:13:57
    Linux系统恢复删除文件的方法 当Linux计算机受到入侵时,...当进程打开了某个文件时,只要该进程保持,打开该文件,即使将其删除,它依然存在于磁盘。这意味着,进程并不知道文件已经被删除,它仍然可以向打开
  • 应用背景: windows操作系统,有时我们关闭程序后,一些相关的进程仍在后台运行,并访问着一些文件,使得我们无法对这些文件及其所属的文件夹进行删除、重命名等操作。 此时,如果知道这个文件/文件夹正在被哪个...
  • c# 删除程序占用的文件,清理删除文件,彻底删除文件,解除文件占用 文件打开时是,以共享模式打开 FileStream inputStream = new FileStream(name, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); p....
  • java进程占用文件无法删除问题

    千次阅读 2017-03-14 15:44:20
    有对目录下文件做操作如listFiles,添加到set集合,上传完毕后关了流,但是删除源文件的时候一直提示被Java进程占用无法删除。想不通资源已经关闭了。最后尝试着在结束操作后加了一句System.gc(); 问题解决。 ps: ...
  • linux找回删除文件

    万次阅读 2019-06-04 11:36:11
    rm -rf /var/log/syslog #删除文件 lsof|grep syslog #查看哪个进程打开了此文件,可以查找到PID ll /proc/PID/fd #进程都在proc目录下,到此目录找到对应的PID/fd 查看这个已经删除文件对应的文件描述符是多少...
  • 在我们删除一个文件,或者说给一个文件重命名的时候,经常会删除不了,提示说这个文件被另外一个进程占用着。那么到底是哪个进程占用了呢?这里我们有解决办法。 打开资源管理器,切换到Performance,然后单击...
  • 1、复制要删除文件所在的路径及文件名,路径...3、点击任务管理器左上角”文件“-”运行新任务“-输入”cmd“-”确定“,输入 ”del“ 然后将文件路径粘贴进去按回车键就删除了(如果不能删除的话,在任务管理器...
  • Linux进程环境下,打开同一个文件,当一个进程进行读写操作,如果另外一个进程删除了这个文件,那么读写该文件进程会发生什么呢? 因为文件删除了,读写进程发生异常? 正在读写的进程仍然正常读写,好像...
  • Linux 删除文件中空行的方法

    万次阅读 2017-09-30 17:35:43
    本文将介绍Linux 删除文件中空行的方法,对于行中只有空格,tab字符的,也可作为空行删除处理,提供完整演示实例。
  • kuaiya\kzippb - 另一个程序正在使用此文件进程无法访问。 问题描述: 平时在删除文件夹或者删除某个单独文件的时候,我们经常会遇见如下问题,如操作无法完成或者文件或者文件夹已在另一程序打开, 当然我尝试...
  • fastdfs的工程流程:首先客户端client 调用fastdfs的api,获取可用的tracker server ,再调用tracker server 获取可用的组,tracker server 通过...client就可以调用storage server对文件进行上传、删除和追加的操作。
  • 如何找回IDEA中删除文件?

    千次阅读 2020-09-06 15:31:26
    我们在使用IDEA的过程中,难免会删除一些文件,事后发现被删除文件需要用到,又苦于不知道原来是怎么做的。其实IDEA可以 找回被删除文件,IDEA对手动删除文件做了一个本地历史记录,默认保存过去12个小时被...
  • 1.确认是否正确删除 2.若只是近期内“移除”,建议从回收站还原后继续如图1删除 3.若删除过程中出现 XXXX文件
  • shell脚本删除linux文件

    万次阅读 2017-03-23 23:31:33
    在linux下的开发,经常可能遇到磁盘满的情况,前面介绍了du命令。但有些情况下,这还不够。有些后台抓包的进程一直...对应末尾数字大于3的test文件都被删除了。 $#表示传入参数的个数 $1表示传入的第一个参数 lt表示
  • jvm占用文件导致文件不能删除,debug过程中尝试手动删除文件会提示“文件已在java platform se binary”打开。 一般来说 java file.delete失败 有以下几个原因 1.看看是否被别的进程引用,手工删除试试(删除不了...
  • 问题:删除文件时,提示文件被占用。 解决方案一:使用360等第三方软件,傻瓜式解除占用。...在CPU的关联句柄搜索待删除文件绝对路径,如图所示,doc文件和pdf文件被占用,结束该进程文件即接触占用。 ...
  • Linux找回误删除文件

    千次阅读 2018-06-24 14:17:00
    尽管删除命令只是在文件节点删除标记,并不真正清除文件内容,但是其他用户和一些有写盘动作的进程会很快覆盖这些数据。在误删后及时发现情况进行一些恢复工作,一定程度上还是有可能找回数据的。 Case 1:...
  • windows系统当我们在删除某个文件或文件夹时有时会提示该文件有程序在使用不能被删除,这时相当惆怅。那么可以用这个方法来找到是哪个进程在占用该文件: 1:打开任务管理器选择“性能” 2:单击下部的“资源监视...
  • 如何改变抽取进程检查点文件中的检查点? 解决概览: 抽取进程的检查点可以通过拷贝然后在新的检查点文件中改变检查点值来改变。 解决: 抽取进程维护三个主要的检查点信息: 1. recovery checkpoint
  • 我的操作是把目标文件复制到当前文件夹下,然后将记录系统设置的数据先从旧的文件中放到新的文件中,使用了SQLiteCommand的ExecuteNonQuery()方法进行更新。 System.IO.File.Copy(localFilePath, Path...
  • win10 删除文件提示“操作无法完成 文件已在windows...第三步,在关联句柄输入需要删除文件的路径进行扫描,对筛选出的结果右击“结束进程” 第四步,返回到需要删除文件路径下即可对其进行删除或其他操作 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,437,602
精华内容 575,040
关键字:

如何删除进程中的文件