这条命令有可能断送DBA职业生涯,我今天真的执行了

文摘   2024-05-30 22:00   上海  

前言

废话不多说,直接上图。没错就是rm -rf *,就问你猛不猛吧?哈哈

这个是从库,没有读业务和其他下游同步,风险可控。但是大家还是要谨慎。我执行这个命令是因为我搜到的菜鸟教程的split命令案例错误导致我生成了大量小文件。没想到大名鼎鼎的菜鸟教程也会有问题,大家还用man或者tldr查看帮助手册吧。

AI 解析报错(问题答案由AI生成,使用前请测试验证)

Q:rm -f *       -bash: /usr/bin/rm: Argument list too long 的原因是啥?

A:当你尝试使用 rm -f * 命令删除当前目录下的所有文件时,如果遇到错误信息 -bash: /usr/bin/rm: Argument list too long,这通常意味着你的当前目录下有大量的文件,多到超过了系统能够处理的参数列表长度限制。

这个问题可以通过以下几种方法解决:

  1. 使用 find 命令: 使用 find 命令可以递归地找到所有文件并删除它们。例如:

    find . -type f -exec rm -f {} \;

    这个命令会找到当前目录及子目录下的所有文件(-type f)并逐个执行 rm -f

  2. 分批删除: 你可以将文件列表分割成较小的部分,然后分别删除。例如,使用 xargs

    find . -type f | xargs -n 100 rm -f

    这里 -n 100 表示每次传递给 rm 的文件数量限制为100。

  3. 使用循环: 如果你不想使用 findxargs,也可以使用简单的循环来删除文件:

    for file in *; do
      rm -f "$file"
    done

    注意,这种方法可能不会递归地删除子目录中的文件。

  4. 增加参数列表大小: 在某些情况下,你可以临时增加 shell 的参数列表大小限制。这可以通过设置 ARG_MAX 环境变量来实现,但这通常不推荐,因为它可能会影响系统的稳定性:

    export ARG_MAX=1048576
    rm -f *

    请注意,这种方法可能会对系统性能产生影响,并且不是所有系统都支持这种方法。

  5. 使用 rsync 删除rsync 可以用来删除文件,并且它不受参数列表大小的限制:

    rsync --remove-source-files --delete-excluded . /dev/null

    这个命令会将当前目录同步到 /dev/null,实质上是删除所有文件。

选择哪种方法取决于你的具体需求和环境。在执行这些操作之前,请确保你了解它们的作用,并小心使用,因为删除文件是不可逆的操作。

追问(问题答案由AI生成,使用前请测试验证)

系统能够处理的参数列表长度限制,是在哪里定义的?系统能够处理的参数列表长度限制是由多个因素决定的,主要包括操作系统的内核参数和shell的配置。以下是一些定义参数列表长度限制的关键点:

  1. 操作系统内核参数

  • 在Linux系统中,参数列表的长度限制可以通过内核的 sysctl 设置进行调整。例如,kernel.pid_max 定义了系统可以处理的最大进程数,这间接影响了参数列表的大小,因为每个进程都需要在参数列表中被引用。
  • 另一个相关的内核参数是 fs.aio-max-nr,它定义了异步I/O操作的最大数量,这也会影响参数列表的大小。
  • exec系统调用的限制

    • 在Unix-like系统中,exec 系统调用用于执行新程序。exec 调用的参数列表长度受到系统定义的 ARG_MAX 限制。这个值定义了传递给 exec 的参数列表的最大字节数。
  • shell的配置

    • Bash shell 有一个 ARG_MAX 环境变量,它表示可以传递给命令的最大参数长度。这个值通常在 /etc/profile/etc/bash.bashrc 等配置文件中设置。
    • 如果没有显式设置,Bash 会尝试读取 /proc/sys/kernel/argmax 来获取这个值。
  • 系统资源限制

    • 每个进程可以使用的内存和其他资源是有限的,这些限制也会影响到参数列表的大小。
  • 硬件架构

    • 系统的硬件架构也会影响参数列表的大小。例如,32位系统和64位系统在内存寻址和处理能力上有所不同,这会影响到参数列表长度的限制。

    要查看当前系统的 ARG_MAX 值,你可以使用以下命令:

    getconf ARG_MAX

    如果你需要调整参数列表的长度限制,可以通过修改内核参数或shell配置来实现,但请注意,这可能会对系统的稳定性和安全性产生影响。在进行这类调整之前,建议详细了解相关的系统文档和最佳实践。

    结论

    我模拟了删除大量小文件的过程,用strace追踪结果同样报错。

    那我strace追踪一个小文件删除过程吧

    root@huoshan1 /data_test2# strace rm -f aaa.txt 
    execve("/usr/bin/rm", ["rm""-f""aaa.txt"], 0x7ffe6d888a30 /* 26 vars */) = 0
    brk(NULL)                               = 0x560c3d84a000
    arch_prctl(0x3001 /* ARCH_??? */, 0x7fffbdbb9df0) = -1 EINVAL (Invalid argument)
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fdf0e583000
    access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=18383, ...}) = 0
    mmap(NULL, 18383, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf0e57e000
    close(3)                                = 0
    openat(AT_FDCWD, "/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
    read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0`\256\3\0\0\0\0\0"..., 832) = 832
    fstat(3, {st_mode=S_IFREG|0755, st_size=2089936, ...}) = 0
    lseek(3, 808, SEEK_SET)                 = 808
    read(3, "\4\0\0\0\20\0\0\0\5\0\0\0GNU\0\2\0\0\300\4\0\0\0\3\0\0\0\0\0\0\0", 32) = 32
    mmap(NULL, 3950816, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fdf0df92000
    mprotect(0x7fdf0e14e000, 2093056, PROT_NONE) = 0
    mmap(0x7fdf0e34d000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1bb000) = 0x7fdf0e34d000
    mmap(0x7fdf0e353000, 14560, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fdf0e353000
    close(3)                                = 0
    mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fdf0e57c000
    arch_prctl(ARCH_SET_FS, 0x7fdf0e584680) = 0
    mprotect(0x7fdf0e34d000, 16384, PROT_READ) = 0
    mprotect(0x560c3bccc000, 4096, PROT_READ) = 0
    mprotect(0x7fdf0e585000, 4096, PROT_READ) = 0
    munmap(0x7fdf0e57e000, 18383)           = 0
    getrandom("\xe8\xc0\x1b\x81\xbd\x2f\x31\x44", 8, GRND_NONBLOCK) = 8
    brk(NULL)                               = 0x560c3d84a000
    brk(0x560c3d86b000)                     = 0x560c3d86b000
    brk(NULL)                               = 0x560c3d86b000
    openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=2997, ...}) = 0
    read(3, "# Locale name alias data base.\n#"..., 4096) = 2997
    read(3, "", 4096)                       = 0
    close(3)                                = 0
    openat(AT_FDCWD, "/usr/lib/locale/en_US.UTF-8/LC_IDENTIFICATION", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/lib/locale/en_US.utf8/LC_IDENTIFICATION", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=368, ...}) = 0
    mmap(NULL, 368, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf0e582000
    close(3)                                = 0
    openat(AT_FDCWD, "/usr/lib64/gconv/gconv-modules.cache", O_RDONLY) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=26998, ...}) = 0
    mmap(NULL, 26998, PROT_READ, MAP_SHARED, 3, 0) = 0x7fdf0e575000
    close(3)                                = 0
    openat(AT_FDCWD, "/usr/lib/locale/en_US.UTF-8/LC_MEASUREMENT", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/lib/locale/en_US.utf8/LC_MEASUREMENT", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=23, ...}) = 0
    mmap(NULL, 23, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf0e581000
    close(3)                                = 0
    openat(AT_FDCWD, "/usr/lib/locale/en_US.UTF-8/LC_TELEPHONE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/lib/locale/en_US.utf8/LC_TELEPHONE", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=59, ...}) = 0
    mmap(NULL, 59, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf0e580000
    close(3)                                = 0
    openat(AT_FDCWD, "/usr/lib/locale/en_US.UTF-8/LC_ADDRESS", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/lib/locale/en_US.utf8/LC_ADDRESS", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=167, ...}) = 0
    mmap(NULL, 167, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf0e57f000
    close(3)                                = 0
    openat(AT_FDCWD, "/usr/lib/locale/en_US.UTF-8/LC_NAME", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/lib/locale/en_US.utf8/LC_NAME", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=77, ...}) = 0
    mmap(NULL, 77, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf0e57e000
    close(3)                                = 0
    openat(AT_FDCWD, "/usr/lib/locale/en_US.UTF-8/LC_PAPER", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/lib/locale/en_US.utf8/LC_PAPER", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=34, ...}) = 0
    mmap(NULL, 34, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf0e574000
    close(3)                                = 0
    openat(AT_FDCWD, "/usr/lib/locale/en_US.UTF-8/LC_MESSAGES", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/lib/locale/en_US.utf8/LC_MESSAGES", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    close(3)                                = 0
    openat(AT_FDCWD, "/usr/lib/locale/en_US.utf8/LC_MESSAGES/SYS_LC_MESSAGES", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=57, ...}) = 0
    mmap(NULL, 57, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf0e573000
    close(3)                                = 0
    openat(AT_FDCWD, "/usr/lib/locale/en_US.UTF-8/LC_MONETARY", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/lib/locale/en_US.utf8/LC_MONETARY", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=286, ...}) = 0
    mmap(NULL, 286, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf0e572000
    close(3)                                = 0
    openat(AT_FDCWD, "/usr/lib/locale/en_US.UTF-8/LC_COLLATE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/lib/locale/en_US.utf8/LC_COLLATE", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=2586930, ...}) = 0
    mmap(NULL, 2586930, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf0dd1a000
    close(3)                                = 0
    openat(AT_FDCWD, "/usr/lib/locale/en_US.UTF-8/LC_TIME", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/lib/locale/en_US.utf8/LC_TIME", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=3316, ...}) = 0
    mmap(NULL, 3316, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf0e571000
    close(3)                                = 0
    openat(AT_FDCWD, "/usr/lib/locale/en_US.UTF-8/LC_NUMERIC", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/lib/locale/en_US.utf8/LC_NUMERIC", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=54, ...}) = 0
    mmap(NULL, 54, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf0e570000
    close(3)                                = 0
    openat(AT_FDCWD, "/usr/lib/locale/en_US.UTF-8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
    openat(AT_FDCWD, "/usr/lib/locale/en_US.utf8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = 3
    fstat(3, {st_mode=S_IFREG|0644, st_size=337024, ...}) = 0
    mmap(NULL, 337024, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdf0e51d000
    close(3)                                = 0
    ioctl(0, TCGETS, {B38400 opost isig icanon echo ...}) = 0
    newfstatat(AT_FDCWD, "aaa.txt", {st_mode=S_IFREG|0644, st_size=5, ...}, AT_SYMLINK_NOFOLLOW) = 0
    unlinkat(AT_FDCWD, "aaa.txt", 0)        = 0
    lseek(0, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
    close(0)                                = 0
    close(1)                                = 0
    close(2)                                = 0
    exit_group(0)                           = ?
    +++ exited with 0 +++

    大家感兴趣可以把这段代码丢你大模型解释一下,哈哈


    欢迎关注公众号:DBA札记,一起交流数据库技术。欢迎觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!谢谢大家。


    DBA札记
    dba 数据库 知识科普 踩坑指南 经验分享 原理解读
     最新文章