V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
felix021
V2EX  ›  推广

Linux 下删点日志也能搞死人

  •  
  •   felix021 · 2020-07-04 12:54:47 +08:00 · 15776 次点击
    这是一个创建于 1601 天前的主题,其中的信息可能已经有所发展或是发生改变。

    rm.png

    想了十天十夜不知道写些什么,那就写写面试题吧。

    1

    在面试应聘者的时候,我常常会问:

    在 Linux 下,如何删除一个目录下的所有 log 文件?

    不知道是不是我人畜无害的围笑给了应聘者我很好应付的错觉

    王宝强.png

    以至于应聘者全都回答:rm *.log

    追问:该目录下可能有很多子目录,如何把子目录里的 log 文件也删掉呢?

    答:rm -r *.log

    一脸人畜无害的笑容.jpeg

    2

    令我很意外的是,真的只有很少的应聘者能想到 find 命令。

    而且想到的人也很少有记得具体用法的。

    周星驰.png

    目前为止只有一个应聘者能够给出完整的命令:

    find -name \*.log -exec rm -f {} \;
    

    注:这里的两个斜杠都不是笔误。

    我觉得 find 应该不算一个很罕见的命令?

    我们有一台共享开发机,因为大家都懒得删 log,经常磁盘爆满,后来我们给它加了个 crontab:

    0 4 * * * find /home/ -type f -name "*.log*" -size +100M -exec bash -c "echo -n > '{}'" \;
    

    注:".log*" 后面的 * 是考虑了 log rotate 。

    注意,这个命令没有用 rm,而是使用重定向来清空文件,原因后面会讲。

    3

    基于清理磁盘空间这个场景,我还会继续问:

    你有遇到过删了 log 文件,但是磁盘空间却没有释放的情况吗?

    有些候选人可能心里在想着:文件删了不就删了吗,还有什么磁盘空间没释放?

    微笑中透漏着.jpeg

    所以有时候我需要解释一下,是 df 命令看到的磁盘空间没有减少。

    还有个候选人努力想了想,和我确认,是不是正好这个目录挂载的是其他磁盘,所以看起来当前磁盘空间没减少。(当然不是)

    思路稍微开阔一点的候选人会想到:你个憨批莫不是删了个软链接吧?

    华而不实的脑子.png

    当然候选人的语气会比较友好。

    然后我会和候选人继续沟通:

    你提到了软链接,那它和硬链接的区别是什么呢?

    有时候我怀疑这几个连续的问题问到候选人开始怀疑人生,因为有的候选人有点犹豫,觉得自己想说的其实是硬链接。

    反正我信了.png

    不过还是有几个候选人知道,软链接是一种文件类型,其内容是目标文件的路径;硬链接是 inode 的别名,同一个 inode 可以有多个链接,在 inode 里记录了硬链接的数量(引用计数)。

    比如这样:

    创建一个空文件,看下 inode 和链接数:

    $ touch a.txt #创建一个空文件
    $ stat -c 'inode %i, links %h' a.txt
    inode 12058942, links 1
    

    创建一个软链接,再看看文件大小:

    $ ln -s a.txt b.txt #软链接
    $ stat -c 'inode %i, links %h' b.txt
    inode 12058978, links 1
    
    $ ls -l b.txt #大小 5 字节
    lrwxrwxrwx ... 5 ... b.txt -> a.txt
    
    $ readlink b.txt #文件内容
    a.txt
    

    创建一个硬链接,看下 inode 和链接数

    $ ln a.txt c.txt #硬链接,inode 不变,链接数变成 2
    $ stat -c 'inode %i, links %h' c.txt
    inode 12058942, links 2
    
    $ ls -l c.txt #大小 0 字节,和 a 一样
    lrwxrwxrwx ... 0 ... c.txt
    

    4

    但实际生产上,遇到 “删了 log 文件、但空间不释放” 通常和软 /硬链接没有什么关系。

    我踩的坑多-不会骗你.png

    实战经验比较丰富的候选人会知道,这往往是因为 log 文件正被另一个进程打开。

    比如在终端 1 打开 a.txt:

    $ python
    >>> f = open("a.txt")
    

    然后在终端 2 可以看到该文件被 Python 打开:

    $ lsof a.txt
    COMMAND  PID ...     NODE NAME
    python  2390 ... 12058942 a.txt
    

    删掉 a.txt ,再查看 python 打开的文件列表:

    $ rm a.txt
    $ ls -l /proc/2390/fd
    lrwx------ 1 user ... 00:04 0 -> /dev/pts/5
    lrwx------ 1 user ... 00:04 1 -> /dev/pts/5
    lrwx------ 1 user ... 00:04 2 -> /dev/pts/5
    lr-x------ 1 user ... 00:04 3 -> /tmp/a.txt (deleted)
    

    注:0 、1 、2 、3 是内核的 fd 编号。0=stdin, 1=stdout, 2=stder 。

    可以看到,a.txt  被标记为已删除,但因为进程还开着它,可能会访问文件的内容,所以内核会等到进程关闭该文件(或进程退出后)才在磁盘上移除这个文件。

    5

    在面试中通常没有机会再问下去了,但实践中往往问题还没解决。

    比如前述共享开发机,就曾遇到了磁盘空间共 800G,但用 du 命令查看,所有文件只占用了 500G 的情况。

    那么:

    1. 如何才能知道现在系统中有哪些文件已删除、但是仍被占用呢?

    $ sudo lsof | grep deleted
    COMMAND   PID  …  NAME
    main   893246  …  /../nohup.out (deleted)
    ...
    

    发现是有大量已经被删除、但仍被某些进程打开的 nohup.out 。

    2. 坑是找到了,该怎么填呢?

    由于这是开发机,很简单,把进程杀掉就好了,进程退出时,内核会负责关闭文件,然后清理占用的空间。

    但如果是线上服务呢?

    Linux 下有一个 package 叫 logrotate,像 nginx 这些服务就是使用它来做日志切割 /轮转的。

    但 nginx 是在后台持续运行的,不能为了切个日志就停止服务,所以它们是这样约定的:

    1. logrotate 执行 rename 系统调用(相当于 mv 命令)重命名日志文件;
    2. 由于 inode 不变,这时 nginx 会继续写入重命名后的日志文件;
    3. logrotate 给 nginx 发送一个 SIGHUP 信号;
    4. nginx 在收到信号后会关闭当前文件,并重新打开日志文件(即创建了新的日志文件)。

    注:为什么是用 SIGHUP 而不是其他信号,以后可能会另开一篇讲讲。

    这样 logrotate 出来的日志,就可以放心删除了。

    对于不支持类似逻辑的服务怎么办呢?

    重启大法。

    如果不怕背 P0 的话,还可以这么作死:

    $ sudo gdb
    (gdb) attach $PID
    (gdb) call ftruncate(3, 0) #按需修改 fd
    $1 = 0
    

    注:看起来文件是清空了,但可能存在其他坑,后果自负。ftruncate 只是清空文件,如果想关闭文件,可以结合 dup 、dup2 、open 和 close 来搞事,不细说了。

    吃药冷静一下.png

    6

    看到这里你应该明白了为什么前面那个 find 命令不直接用 rm 了吧?

    照例总结下:

    1. 可以用 find 查找文件
    2. 软链接存的是路径,硬链接共享 inode
    3. 删除被进程打开的文件,磁盘空间不会释放
    4. lsof 很好用(不只是看文件的占用)

    还想知道其他有意思的面试题吗?

    不如投个简历来亲身体验下:

    ~ 投递链接 ~

    投放研发工程师(上海)

    https://job.toutiao.com/s/J8DRDyG

    高级广告研发工程师(北京)

    https://job.toutiao.com/s/J8DNwJY

    欢迎关注

    weixin2s.png

       ▄▄▄▄▄▄▄   ▄      ▄▄▄▄ ▄▄▄▄▄▄▄  
       █ ▄▄▄ █ ▄▀ ▄ ▀██▄ ▀█▄ █ ▄▄▄ █  
       █ ███ █  █  █  █▀▀▀█▀ █ ███ █  
       █▄▄▄▄▄█ ▄ █▀█ █▀█ ▄▀█ █▄▄▄▄▄█  
       ▄▄▄ ▄▄▄▄█  ▀▄█▀▀▀█ ▄█▄▄   ▄    
       ▄█▄▄▄▄▄▀▄▀▄██   ▀ ▄  █▀▄▄▀▄▄█  
       █ █▀▄▀▄▄▀▀█▄▀█▄▀█████▀█▀▀█ █▄  
        ▀▀  █▄██▄█▀  █ ▀█▀ ▀█▀ ▄▀▀▄█  
       █▀ ▀ ▄▄▄▄▄▄▀▄██  █ ▄████▀▀ █▄  
       ▄▀▄▄▄ ▄ ▀▀▄████▀█▀  ▀ █▄▄▄▀▄█  
       ▄▀▀██▄▄  █▀▄▀█▀▀ █▀ ▄▄▄██▀ ▀   
       ▄▄▄▄▄▄▄ █ █▀ ▀▀   ▄██ ▄ █▄▀██  
       █ ▄▄▄ █ █▄ ▀▄▀ ▀██  █▄▄▄█▄  ▀  
       █ ███ █ ▄ ███▀▀▀█▄ █▀▄ ██▄ ▀█  
       █▄▄▄▄▄█ ██ ▄█▀█  █ ▀██▄▄▄  █▄  
    
    第 1 条附言  ·  2020-07-04 14:09:40 +08:00
    欢迎探讨,从本文的回复中我也学到了一些新的知识点(比如 find 的 -delete 参数,以及直接 echo 到 procfs 清文件);不过一看到不同观点就上头开喷的同学,建议下次就不要点开了。
    180 条回复    2020-07-07 11:38:24 +08:00
    1  2  
    vk42
        1
    vk42  
       2020-07-04 13:00:25 +08:00
    最后那个,废那么大劲上 gdb 干嘛,直接 echo > name.log 就行了……
    felix021
        2
    felix021  
    OP
       2020-07-04 13:02:10 +08:00
    @vk42 name.log 已经被删了呀,你试试看[doge]
    imdong
        3
    imdong  
       2020-07-04 13:02:25 +08:00   ❤️ 24
    曾经自己负责面试,发现自己有时会落入这样的思维:

    5 * 6 = 30,提问:30 等于什么?

    而往往面试者的回答让你无法满意。
    Cooky
        4
    Cooky  
       2020-07-04 13:02:38 +08:00   ❤️ 4
    讲了半天废话,lsof 自己去看
    webassembly
        5
    webassembly  
       2020-07-04 13:03:17 +08:00
    写的很棒。 但是不好意思,我题还没刷够,不敢投。
    felix021
        6
    felix021  
    OP
       2020-07-04 13:04:22 +08:00
    @imdong 嗯,知识的诅咒
    felix021
        7
    felix021  
    OP
       2020-07-04 13:04:43 +08:00   ❤️ 3
    @imdong 想起这个实验

    1990 年,美国斯坦福大学研究生伊丽莎白·牛顿( Elizabeth Newton )因一项研究而获得心理学博士学位。他研究的是一个简单的游戏,受试者分别扮演 “击节者” 和 “听猜者” 两类角色。击节者拿到一份列有 25 首著名曲目的清单,包括《祝你生日快乐》和美国国歌《星条旗永不落》等耳熟能祥的歌曲。每位击节者选定一首,然后在桌上把曲子的节奏敲给听猜者听。听猜者的任务是根据敲击的节奏猜出正确的歌名。 这个游戏里听猜者的工作相当不轻松。在牛顿的实验过程中,击节者一共击打了 120 首歌,听猜者只猜对了 3 首,成功率 2.5%。
    felix021
        8
    felix021  
    OP
       2020-07-04 13:11:21 +08:00   ❤️ 2
    @Cooky 如果你能跳出喷子的思维方式的话,就会发现这篇文章还介绍针对面试官的面试技巧、一些冷门的知识点、以及在写作时如何调动读者的情绪。
    vk42
        9
    vk42  
       2020-07-04 13:11:38 +08:00
    @felix021 我的意思是对已知占用的文件一般都习惯用 echo 清空,如果已经不小心删了,可以从 procfs 里面直接 echo 对应 fd
    felix021
        10
    felix021  
    OP
       2020-07-04 13:15:19 +08:00
    @vk42 赞,试了下 echo > /proc/$PID/fd/$fd 确实可以;不过随着时间累积这个文件还是会继续增长,依然让人蛋疼。
    darksword21
        11
    darksword21  
       2020-07-04 13:15:26 +08:00
    面试者:hashmap 在 1.8 与 1.7 不一样,是用红黑树实现的
    面试官:哦,那你简单实现下红黑树吧🐕️
    ( ps:就是说以下,我不是搞 java 的)
    felix021
        12
    felix021  
    OP
       2020-07-04 13:16:39 +08:00
    @darksword21 哈哈哈,我们内部面试培训的时候专门喷过这个事情,不要让候选人手撕红黑树,我最多就问下这个数据结构的特性。
    wangking
        13
    wangking  
       2020-07-04 13:18:32 +08:00
    1 楼的方法可能更好一些, 之前遇到过 rm 日志服务报错的 ,感觉 lz 这个面试题,还是侧重一些有工作经验的人员。
    felix021
        14
    felix021  
    OP
       2020-07-04 13:23:23 +08:00
    @wangking 这是一套有区分度的题目,用来考察候选人掌握到什么程度,再往深也还可以继续问,文件系统缓存之类的。
    matrix67
        15
    matrix67  
       2020-07-04 13:24:51 +08:00   ❤️ 1
    我们有一台共享开发机,因为大家都懒得删 log,经常磁盘爆满,后来我们给它加了个 crontab:

    0 4 * * * find /home/ -type f -name "*.log*" -size +100M -exec bash -c "echo -n > '{}'" \;

    开发机这么做也太暴力了,我感觉干掉.1 .2 的日志还行,你把当天的也干掉了,有问题也查不了了吧。
    momocraft
        16
    momocraft  
       2020-07-04 13:35:41 +08:00   ❤️ 1
    find -delete
    felix021
        17
    felix021  
    OP
       2020-07-04 13:37:34 +08:00
    @matrix67 嗯,如果加上 mtime 会更好,不过是凌晨 4 点清日志,目前没人抱怨。另外我们其实有磁盘足够大的开发机,但很多人懒得迁,如果不爽的话正好能有点动力迁。
    felix021
        18
    felix021  
    OP
       2020-07-04 13:45:20 +08:00
    @momocraft 赞 我之前还没注意到 find 有这么个参数
    CRVV
        19
    CRVV  
       2020-07-04 13:51:25 +08:00   ❤️ 40
    https://www.v2ex.com/t/655096

    原来是同一个人发的,怪不得又是这种奇怪的面试题。我再来喷一次。

    1. 在 Linux 下,如何删除一个目录下的所有 log 文件?

    你需要给定什么叫做 log 文件,如果是文件名以 log 结尾的文件,那当然是 rm *log
    删子目录是 rm **/*log

    日志文件是日志文件,文件名随便是什么都可以;文件名以 log 结尾的文件是文件名以 log 结尾的文件;文件名以 .log 结尾的文件是文件名以 .log 结尾的文件,这都不一样的。真不知道你的 “log 文件” 到底是啥。

    2. find 是一个不常用的命令,原因是这个命令的功能通常能被 shell 的 * 或者 ** 代替。
    另外 find 功能很强,用法也很复杂,有几十个参数,参数之间有逻辑关系而且还可以套别的命令,如果不是有很特殊的需求,不会来用 find 。而且 GNU find 和 BSD find 的用法还不完全一样。
    你给出的那一行 find 命令是错的,少了一个 .
    find . -name \*.log -exec rm -f {} \;
    这一行也可以写成
    IFS=$'\n'; for f in **/*.log; do rm "$f"; done
    这个可能是更常见的用法

    3. 删了文件磁盘空间不释放这很正常,还有可能是 btrfs 或者 zfs 上给 dedup 了。
    有这么多种可能性,我不知道为什么来面试的人就必须要想到是文件还在被占用。

    4. 把日志文件删掉了,因为那个文件还在被使用,所以磁盘空间没释放。
    我就想问一句,贵司真是这么删日志的么?
    正在被打开的日志文件,意思是还有进程在往里面写日志,我想不到有正常的运维会删一个正在被写入的日志文件。
    在我的认知里,删日志都是删若干时间之前,肯定不会再用到的老日志。这全新的还在写的日志文件你这么都随便地删掉了,那当初为啥要记这个日志呢?
    能被这种神操作理直气壮地出到面试题里面,贵司确实蛮厉害的。
    felix021
        20
    felix021  
    OP
       2020-07-04 13:59:46 +08:00   ❤️ 1
    @CRVV
    1. 面试的时候可以多沟通,这也是考查的一部分
    2. 在 mac 下跑会错,但我问的是在 Linux 下,请实践一下再喷。
    3. 我没有说必须要想到这一点,如果能给出其他答案我也会很愿意沟通。
    4. 你开心就好,我没打算写出让所有人都喜欢的文章。
    CRVV
        21
    CRVV  
       2020-07-04 14:01:17 +08:00   ❤️ 15
    如果我去面试,你问我要怎么删除日志文件把磁盘空间清出来,估计我会回答

    journalctl --vacuum-time=30days
    defunct9
        22
    defunct9  
       2020-07-04 14:10:52 +08:00 via iPhone   ❤️ 1
    唉,都不会了。自己已经完全不是个合格的运维了
    Osk
        23
    Osk  
       2020-07-04 14:13:50 +08:00
    我想到的是 find 加 -type f -delete 这两个参数。。。
    Vegetable
        24
    Vegetable  
       2020-07-04 14:18:54 +08:00
    这些问题对于开发来说,有点生僻了,像是在考察见识。

    比如没 rotate 的日志持续写入怎么才能释放空间?我第一次遇到这个问题用了 truncate,以后一直都用这种方法,所以也没试过别的。
    按照日期切分日志的时候,怎么保证切的准?怎么保证不断写入流,怎么保证不丢日志。
    怎么使用 find 删除过期文件。
    这些乱七八糟的问题解决过也就解决过了,没解决过也只能证明经验不是很足。
    Cooky
        25
    Cooky  
       2020-07-04 14:21:01 +08:00   ❤️ 3
    @felix021 我没有喷,废话太多是事实,一句话掰开十句话说谁都会。
    dongisking
        26
    dongisking  
       2020-07-04 14:22:42 +08:00
    学到了!
    felix021
        27
    felix021  
    OP
       2020-07-04 14:24:28 +08:00
    @Vegetable 嗯,有的时候边界确实不好拿捏,知识的诅咒就是“你知道的知识都会觉得简单,你不知道的都会觉得难”,我只能尽量选择那种上手简单(比如删 log )、但有区分度的(实际会有不同的需求和问题),可以一层一层展开,但毕竟是面试,问题本身是开放式的,如果候选人的回答走了其他路线,比如你提到的这些问题,我觉得都是很好的,都能体现工作经验和对问题的钻研。
    felix021
        28
    felix021  
    OP
       2020-07-04 14:31:00 +08:00   ❤️ 1
    @Cooky 我对喷子的定义是只给出破坏性的评论,给不出建设性的评论。我写的内容本来就不打算也不可能满足所有人,只是建议你不要逞口舌之快,对你自己和对别人都没有什么帮助。
    JackieMe
        29
    JackieMe  
       2020-07-04 14:39:03 +08:00 via Android
    挺好的,很有启发性,打破砂锅问到底的感觉。我记得 find 文档里好像还讲了调用 rm 和直接用 -delete 的区别,可以看一下。
    wangkun025
        30
    wangkun025  
       2020-07-04 14:43:28 +08:00
    我删日志都是找到那个日志,然后用 rm 删掉。
    我不敢搞批发。
    幸亏不是运维。
    angryfish
        31
    angryfish  
       2020-07-04 14:43:30 +08:00 via iPhone
    楼主出的这些题,刚毕业那时我都会。现在不会了。工作没用到,久了就会忘。
    lovecy
        32
    lovecy  
       2020-07-04 15:13:02 +08:00
    for i in `find ./ -name "*.log"`;do echo $i;rm -f $i;done;
    目前我只能写出这种东西,啊哈哈哈哈
    ruidoBlanco
        33
    ruidoBlanco  
       2020-07-04 15:24:27 +08:00   ❤️ 22
    我专门上来喷的。

    首先,批量删 log 这个需求就是有病。log 是为了日后有得查的,rotation 才是正确的处理。遇到特殊情况单个日志撑满了硬盘,也只用删单个。上来就干绝户的事情,脑壳坏了。

    再者,即使删,用得着写 cron,时不时来个杀满门?这是得多有洁癖或者你们的系统 log 里有多少没解决的报错视而不见?

    最后,命令行功底也不行。

    贵司的运维水平大概了解了,糟糕。
    felix021
        34
    felix021  
    OP
       2020-07-04 15:24:33 +08:00 via Android
    @lovecy 还可以试试 管道 + xargs,解决方法有很多~
    felix021
        35
    felix021  
    OP
       2020-07-04 15:27:26 +08:00 via Android
    @ruidoBlanco 看到自己的点立马高潮开喷也算是 v2 的一个特色了,又见识了一次。

    清理的是因为共享人数太多导致磁盘爆满的共享 [开发机] ,相信您阅读能力没问题,只是懒得看清楚就直接开喷了。
    ruidoBlanco
        36
    ruidoBlanco  
       2020-07-04 15:36:40 +08:00   ❤️ 3
    @felix021 人多不是理由,开发机也不是理由,自己日志管理有毛病。
    felix021
        37
    felix021  
    OP
       2020-07-04 15:37:45 +08:00
    @ruidoBlanco 你开心就好
    lfhong
        38
    lfhong  
       2020-07-04 15:53:09 +08:00 via iPhone   ❤️ 1
    @ruidoBlanco 专门上来顶一下你
    rockyou12
        39
    rockyou12  
       2020-07-04 16:31:54 +08:00   ❤️ 1
    @felix021 开发机删日志还需要折腾命令?直接用 sftp 的图形界面工具(xshell 、finalshell 都可以)上去删就是了,哪个弱智运维没事折腾这个?
    felix021
        40
    felix021  
    OP
       2020-07-04 16:51:40 +08:00 via Android
    @rockyou12 建议多思考和理解别人存在的现实问题,而不是只活在自己臆想的世界里。

    p.s. 被种过马的 ssh 客户端,比如 putty 和 xshell 我通常选择敬而远之。
    vinceguo
        41
    vinceguo  
       2020-07-04 16:58:04 +08:00 via Android
    记得几个命令就找优越感,可笑,google 三秒钟的事儿。我来说一个,看看你能不能答上来:cd 这个命令二进制文件在哪?如果你机器上有,执行一下看看有没有效果?看看现象,说说原因
    gtexpanse
        42
    gtexpanse  
       2020-07-04 17:02:11 +08:00 via iPhone
    可能大家的开发环境资源都比较充足吧,我就经常要上去自己清理日志,lsof 这些感觉都是经常碰到的问题,这个算便吗?
    felix021
        43
    felix021  
    OP
       2020-07-04 17:09:05 +08:00 via Android
    @vinceguo 如果候选人能答出是 bash 内建命令当然最好,如果不行,能说明用 which 查找或者给出常见的 PATH 表明了过去的经验。

    建议关注面试方法而不是抓住你自以为是的一个知识点。
    xupefei
        44
    xupefei  
       2020-07-04 17:10:35 +08:00 via iPhone   ❤️ 1
    logrotate 会自动删掉旧日志,保留几个旧日志也能自己设置,最好还是不要全删。
    felix021
        45
    felix021  
    OP
       2020-07-04 17:11:59 +08:00 via Android   ❤️ 1
    @gtexpanse 他们大概没有经历过因为各种历史问题好几十个人使用同一个开发机,以及一个测试服务随便就可以打几十 GB debug log 的场景,然后就活在自己的世界里: “怎么可能有这种事情?” 想起一个小学成语,怕说出来太伤人:)
    felix021
        46
    felix021  
    OP
       2020-07-04 17:14:10 +08:00 via Android
    @xupefei 是的,问题场景是开发机,没有谁给自己设置合理的 logrotate,有时候测试起来就一个人留下几十 G 日志。文中的方法简单粗暴,但解决问题效果好。
    so1n
        47
    so1n  
       2020-07-04 17:14:52 +08:00 via Android
    不是运维,但不建议删除有进程还在写入的日志文件
    felix021
        48
    felix021  
    OP
       2020-07-04 17:15:51 +08:00 via Android
    @so1n 嗯,但是很多人不知道这一点,也不明白为什么。
    xupefei
        49
    xupefei  
       2020-07-04 17:20:18 +08:00 via iPhone
    @felix021 既然 log 都在一个目录下,那管理员能不能设置半小时一次 logrotate ?
    aguesuka
        50
    aguesuka  
       2020-07-04 17:23:49 +08:00   ❤️ 6
    问这种问题说明公司要开发干运维的活,千万不要去
    optional
        51
    optional  
       2020-07-04 17:30:12 +08:00
    find 的"高级用法"太复杂了,其实也违背了 KISS 原则,如果不是招运维,一般不会问太深的 linux 命令,日常开发一般我都配合 xargs 或者 grep 干活
    find . -name \*.log | grep xxxx | xargs -i {} rm -f {}
    felix021
        52
    felix021  
    OP
       2020-07-04 17:42:28 +08:00 via Android
    @optional 嗯,所以我也不知道还有个 delete 参数; 但是会 xargs 也很 ok 啊,本来就是开放式问题,关键是如何提出解决方案
    twl007
        53
    twl007  
       2020-07-04 17:47:13 +08:00 via iPhone   ❤️ 1
    自己没有完善的日志收集系统怪人家删日志不对?说实话也不知道这题你让人家答出来了能意味着什么 踩坑踩的多?而且这种看你一篇文章就解决的问题在面试里面有什么好问的……
    einsdisp
        54
    einsdisp  
       2020-07-04 17:47:41 +08:00   ❤️ 2
    几点补充:

    1 、删除文件却没有释放空间,还存在一种可能:文件系统快照(例如 btrfs,zfs 诸如此类的),此文件虽然删除了,但仅仅是在当前挂载的快照中被删了,仍然被其他快照使用着

    2 、find 命令可以优化:

    ```bash
    find -name \*.log -exec rm -f {} \;
    ```
    此命令性能较差,每存在一个文件就执行一次`rm`命令

    可优化为

    ```bash
    find -name '*.log' -print0 | xargs -0 rm -f
    ```
    einsdisp
        55
    einsdisp  
       2020-07-04 17:49:10 +08:00
    3 、systemd 相关日志文件是二进制的,需要使用 systemd 专有的命令释放磁盘空间
    twl007
        56
    twl007  
       2020-07-04 17:50:27 +08:00 via iPhone   ❤️ 1
    而且你这些方案 有几个有扩展性的 一台还凑乎 十台也能忍 要是一百台呢?大家去批量服务器跑命令去?这还不说你那些命令在批量跑的时候还会涉及到字符转义的问题
    einsdisp
        57
    einsdisp  
       2020-07-04 17:56:40 +08:00
    差点忘记了 find 命令本身就有 `-delete` 参数
    ruanimal
        58
    ruanimal  
       2020-07-04 17:59:04 +08:00   ❤️ 1
    @felix021 主要是你自己去别的公司面试不一定答得出来
    msg7086
        59
    msg7086  
       2020-07-04 18:00:50 +08:00 via Android   ❤️ 1
    竟然真的有人认为面试的时候问问题是期待别人精确回答?
    你要是有能力说出 journald 或者 elk 或者 zfs 后台延迟删除或者快照引用,面试官会因为一个 find 命令把你刷掉?真搞不懂是强杠还是没脑子。
    caola
        60
    caola  
       2020-07-04 18:00:59 +08:00
    系统自带的日志分割工具,你为啥不用?
    hugee
        61
    hugee  
       2020-07-04 18:01:18 +08:00
    这是我在 v2 看到佷干货的帖子了,虽然比较浅显,但叙述方式很好。赞一个
    hatebugs
        62
    hatebugs  
       2020-07-04 18:02:47 +08:00 via Android
    这个算校招面试题难度吧 😂
    felix021
        63
    felix021  
    OP
       2020-07-04 18:03:24 +08:00 via Android
    @ruanimal 回答不出某一题没有关系,一场面试四十五分钟,能在某一些方面表现出亮点就够了。面试一方面考察工作经验,更重要的是考察解决问题的思路。
    hatebugs
        64
    hatebugs  
       2020-07-04 18:03:29 +08:00 via Android
    升级一点 问问 exec
    felix021
        65
    felix021  
    OP
       2020-07-04 18:03:54 +08:00 via Android
    @caola 文章里写得这么清楚,你为何不看就喷?
    felix021
        66
    felix021  
    OP
       2020-07-04 18:05:11 +08:00 via Android
    @msg7086 是啊,我也觉得这些人很无语,大概没正经当过面试官吧,把自己套到候选人角色里,然后受迫害妄想症就发作了。
    felix021
        67
    felix021  
    OP
       2020-07-04 18:06:39 +08:00 via Android
    @twl007 你没有耐心了解细节,我也没有耐心解释,你开心就好。
    twl007
        68
    twl007  
       2020-07-04 18:08:34 +08:00 via iPhone   ❤️ 1
    @felix021 呵呵 你怎么这么确定细节我知道的比你少?只是觉得这么面没什么意义罢了 不知道你们招人是看中这个人能干什么还是看中对方的潜力 这种无非是知道和不知道的题 面试的时候能看出什么
    felix021
        69
    felix021  
    OP
       2020-07-04 18:09:39 +08:00 via Android
    @xupefei 线上都有完备的解决方案,不只是 rotate,还有专门的 es 日志采集和查询等。我是在解决共享开发机的问题,指望每一个人都合理设置的成本太高。
    realpg
        70
    realpg  
       2020-07-04 18:14:03 +08:00   ❤️ 8
    我觉得楼主用这些做考察点,真的是很没意思。
    因为啥,这些我确实都知道,但是我曾经也不知道,我知道的原因是我曾经遇到过一次,然后我随便查查资料,大约 10 分钟就知道咋回事也会解决了。

    这种类似问题,知道的就是自己遇到过,难道招聘运维不是考察学习能力和分析问题的能力,而是考察遇到过的东西又多广,那只要招一个不那么水,而且岁数足够大的就行了。
    twl007
        71
    twl007  
       2020-07-04 18:16:13 +08:00 via iPhone
    @realpg 他是想招踩坑踩的多的 根本就不看你解决问题的能力 当然照楼主这么问 也问不出你解决问题能力如何
    msg7086
        72
    msg7086  
       2020-07-04 18:16:18 +08:00   ❤️ 1
    面试的问题是用来探索你的知识面的。

    比如经典面试问题之一,当你在浏览器上输入网址按下回车后,会发生哪些事情。
    不会有人真的以为以后在这公司工作就是要研究按下回车后发生了什么吧?

    运维也是同理,问你怎么删日志文件,那首先你要回答怎么删文件,其次你要延伸到删文件后会出现哪些文件(文件太多 globbing 破长度,句柄没关闭导致无法释放空间等等),然后再往下你可以提出更好的解决方案,例如 logrotate 按日分割,然后 cron 定时移走,又或者是 ELK 等集中日志方案等等。

    要是还要面试官问一句你挤一下牙膏,然后连浅层的操作系统概念都不懂,你还指望啥?

    就像数学考试,小学数学题都做不出来,还要硬说平时只搞博士研究,你说别人能信吗。
    twl007
        73
    twl007  
       2020-07-04 18:19:24 +08:00 via iPhone   ❤️ 1
    @msg7086 所以你想招的是 System Administrator 还是 System Engineer?
    jackmod
        74
    jackmod  
       2020-07-04 18:26:12 +08:00
    find -print0 | xargs -0
    反正不喜欢 \; 这种格式
    twl007
        75
    twl007  
       2020-07-04 18:26:32 +08:00 via iPhone   ❤️ 2
    我觉得这个题应该从如何管理日志去问 一台 十台 一百台的时候要怎么做 如何解决大家要去查一些共享日志的需求 中间遇到了问题怎么解决 而不是上来就问一句怎么删日志
    JaeCoding
        76
    JaeCoding  
       2020-07-04 18:29:08 +08:00
    一年工作经验开发人员表示平时接触 linux 命令机会场景不多,只知道基础命令,是我的欠缺么。
    mymike
        77
    mymike  
       2020-07-04 18:32:07 +08:00   ❤️ 2
    这套题的意义真不大,操作过就会,没操作过就不会
    不过如果应聘者的简历上写着,精通各种运维知识,解决过 XXXX,那还真可以这么问问
    msg7086
        78
    msg7086  
       2020-07-04 18:35:55 +08:00
    @twl007 招什么不都行?
    能力强的放在高一点的职位上,能力菜的放下面点,至于连小学数学题都做不出的还是算了吧。
    起手就是博士题也不是不行,只不过回头肯定要有人喷你面造入拧了。

    还是那句话,问题是什么并不重要,重要的是如何去回答。面试官从来就不需要你去针对一个面试问题给出直接而精准的答案。换句话说,这个面试问题和「请详细描述如何用不同的方式正确地储存和清理日志」是一样的。就如数学考试,面试官只需要知道你的水平是「小学生级别」还是「大学生级别」,还是「博士级别」。他给你的考题可以是小学生数学考题,但是你完全可以拓展到数学系博士的知识级别去回答。

    面试的过程是你把自己展示给面试官的过程,不是那种答对多少题就有多少奖金的电视节目。
    似乎真的有很多人不知道其中的区别?
    twl007
        79
    twl007  
       2020-07-04 18:50:36 +08:00   ❤️ 4
    @msg7086 所以你觉得问这种花 5 分钟上网一搜就能解决的问题意义很大是么?楼主问得这么具体所求的不是一个答案么?真正不不要求精准答案的边界都很开放的,我不觉得这种指向性这么明确的问题是个开放性问题。所以你通过这个题就能看出面试者是小学生还是博士级别了么?一场面试也就一个小时,你打算花长时间来这么问出来对面是什么水平?

    而且说实话我真觉得问这种问题的公司真的是基础架构没做好。有良好的日志收集还需要大家去登陆到机器上去手动查看日志?就像楼主知道的这么清楚了,那应该去改善这个问题,而不是拿出来去面别人。

    我还是那个问题你们想要的是一个 System Administrator 还是 System Engineer 。对于这种坑,说真的我希望遇到人越少越好,有些时候这些基础问题反而能看出一个公司的 DevOps 是不是在正经的干活。
    wdlth
        80
    wdlth  
       2020-07-04 18:55:53 +08:00
    我们这边这种需求,日志都是统一收集的,不会出现本地磁盘文件。
    blless
        81
    blless  
       2020-07-04 18:58:19 +08:00 via Android
    老运维了,我是不敢随便用 rm *或者用 find 加脚本后 exec … 有相当大的概率 匹配到 /目录
    CRVV
        82
    CRVV  
       2020-07-04 19:06:37 +08:00 via Android   ❤️ 10
    @msg7086
    > 竟然真的有人认为面试的时候问问题是期待别人精确回答?

    通常情况下当然不会这么想,但是楼主的原文里面有不少带这种含义的句子。

    "令我很意外的是,真的只有很少的应聘者能想到 find 命令"
    这里很明白地在表示自己期望别人回答用 find 来查找文件。

    3 里面提到说有人回答说可能是删了软链接,这当然是一个正确的回答。

    但是楼主随后就断言
    "但实际生产上,遇到 “删了 log 文件、但空间不释放” 通常和软 /硬链接没有什么关系。"
    明确地否定了这个答案。

    "实战经验比较丰富的候选人会知道,这往往是因为 log 文件正被另一个进程打开。"
    也就是说回答前面那种答案的人,实战经验少。

    在我看来这个文件被占用的答案才是实战经验少,估计是刚毕业吧,因为线上服务的日志都是有人专门管理的,我在公司从来没听说过删日志这个操作,在自己的机器上随便玩倒是经常删。

    原文里面有一句 "但如果是线上服务呢?",然后楼主在下面的回帖说是多人共用的开发机,那这完全是两码事。

    如果是你可以随便折腾的开发机,那这个问题的很多前提都不成立。另外开发机上的日志可能更重要,也许是同事若干天的劳动成果。

    这种问题,要么是开放的随便怎么回答都可以,那么你出的题目就不能有这么明显的局限性。比如你可以问怎样批量进行文件操作,可以问磁盘满了怎么解决。但是不能把情景人为地组合在一起,因为这样组出来的情景就不合逻辑了。
    newtype0092
        83
    newtype0092  
       2020-07-04 19:07:53 +08:00   ❤️ 3
    @msg7086
    面对不熟悉的问题时
    知识匮乏的人,只会用愤怒、讥讽掩盖自己的气急败坏
    有实力的人,能从自身丰富的知识储备来寻找答案,并汲取有用经验

    某些人的面试三板斧:
    这个意义不大,实际场景用不到
    这个不用自己写,调一下库就行
    这个我没用过,用的时候百度一下就知道了

    我是一点也不愿意和这些人做同事的。。。
    defunct9
        84
    defunct9  
       2020-07-04 19:14:09 +08:00 via iPhone
    rust 的 fd 是个好工具,推荐下
    xuanbg
        85
    xuanbg  
       2020-07-04 19:19:21 +08:00
    日志通过 Fluentd 搞进 ES 里面去,讨厌的 log 文件就没有了。Kibana 删索引文件可方便了,查日志也方便。
    msg7086
        86
    msg7086  
       2020-07-04 19:34:58 +08:00
    @CRVV #82

    1) 想不到 find 可以想别的办法。
    我觉得楼主实际要表达的意思是,应聘者连 find 都不知道,还要我去告诉他们,我还能指望他们给出更高水平的答案?

    2) 生产上删了 log 空间不释放,这个问题其实原本应该是应聘者问面试官的。
    在执行 find 和 rm 之前,应该先主动检测有没有正在运行的服务已经打开了文件。
    这是需要应聘者提前要求 clarification 的,而不应该做 assumption 说 log 文件都已经被安全关闭,可以直接删除。

    当然,这条是对应聘者要求过高了,所以如果没有提前问,直接回答一股脑删了,面试官补问空间不释放的时候再答打开的文件描述符我觉得也是很合理的。你也可以回答说可能是 ZFS 文件系统在后台缓慢释放空间,等等。

    3) 线上服务日志有专人管理,你自己连日志都不碰,说明你实战经验丰富?
    事情都甩锅给别人来做说明实战经验多,事情自己来做说明实战经验少,这个说法我还是头一次听到,挺新鲜的。
    你们招的都是高中毕业生么,那种没摸过服务器的「实战经验多」的人吧,我们这些玩过十几年 Linux 实战经验少的人肯定马上就被刷掉了。
    zk8802
        87
    zk8802  
       2020-07-04 19:36:57 +08:00 via iPhone   ❤️ 1
    谢谢楼主写文章分享这些不算基础的基础知识,很开眼界。太多人只纠结在如何从文章中写得不完善的地方入手开喷,而不是取文章之精华。这些大部分都是 losers,希望楼主不要在意。
    freelancher
        88
    freelancher  
       2020-07-04 19:55:09 +08:00
    ????运维基础啊。和研发有毛线关系???

    你把工资提到 2W 。别人的回答层次就上来了。估计就几千块钱的岗位。
    E1n
        89
    E1n  
       2020-07-04 20:08:30 +08:00 via Android
    自信又回来了 w
    CRVV
        90
    CRVV  
       2020-07-04 20:11:08 +08:00   ❤️ 1
    @msg7086

    2.
    楼主的原文里可没有说要检查文件有没有关,而且楼主还给出了文件没关情况下释放磁盘空间的方法。
    你觉得应聘者可以有更高级的回答,那当然是好事。但是楼主作为面试官,他给出的答案就是一股脑删了,而且本来在用的文件,用 rm 不会删除的东西,也被删了。我喷的就是他预期的这个答案。

    3.
    我的原文是
    "在我看来这个文件被占用的答案才是实战经验少,估计是刚毕业吧,因为线上服务的日志都是有人专门管理的,我在公司从来没听说过删日志这个操作,在自己的机器上随便玩倒是经常删。"
    被你曲解成了
    "事情都甩锅给别人来做说明实战经验多,事情自己来做说明实战经验少"

    楼主说删了一个日志文件,磁盘空间没被释放,出现这个情况的原因是这个文件还在被占用。

    正式服务器被占用的日志文件不能删,运维不可能在工作中发现,欸我删了一个日志文件怎么磁盘没释放结果是日志文件还在被占用。
    有专人管理的意思是说他不能让服务器出现日志把磁盘占满的情况,这都有监控的,快满了要报警,报警了就要解决,这是他的工作。如果都已经磁盘满了需要手动 rm 文件或者 echo> 了,那这系统已经病入膏肓了,这是不能允许出现的情况。不是说现在磁盘满了系统挂了这都是运维的事和我没关系。

    你玩过十几年 Linux,知道删除一个被打开的文件不会释放磁盘空间,但你大概率不是通过删日志文件学到这件事情的。
    但是,楼主已经给定了线上服务器日志文件管理这个场景,在正常操作服务器的前提下,就已经排除掉了文件没关这种可能性。但还说可能是这样,那我只能说是没经验了。


    > 请详细描述如何用不同的方式正确地储存和清理日志

    这完全是另外一个问题,楼主原本的问题是 "在 Linux 下,如何删除一个目录下的所有 log 文件?"
    如果我看到这个问题,我不可能回答 "请详细描述如何用不同的方式正确地储存和清理日志"。
    面试官当然可以问 "请详细描述如何用不同的方式正确地储存和清理日志"。
    但如果你想问的是这个问题,然后实际问的是 "在 Linux 下,如何删除一个目录下的所有 log 文件",那这正是我要喷的点。
    petelin
        91
    petelin  
       2020-07-04 20:26:31 +08:00 via iPhone
    我也不支持楼主。 没意义的问题,具体场景只有你知道,你不说我怎么知道文件夹下面还有不是日志的东西?但是你就默认有 那我只能说你开心就好
    HunterPan
        92
    HunterPan  
       2020-07-04 20:32:02 +08:00
    不喜欢这种方式,难道面试不是问对方最擅长的么?计算机知识太多了,一方面掌握的很好就不错了.
    20150517
        93
    20150517  
       2020-07-04 20:33:58 +08:00   ❤️ 2
    牛逼啊,推公众号么就推好了,一个个怼下来是怎么回事
    rockyou12
        94
    rockyou12  
       2020-07-04 21:01:53 +08:00
    @felix021 抬杠哪个不会?你 ssh 客户端怕安全问题,咋没整堡垒机呢?堡垒机 dashboard 也没有看不到文件系统的把,那你折腾啥呢?

    ----
    建议多思考和理解别人存在的现实问题,而不是只活在自己臆想的世界里。

    p.s. 被种过马的 ssh 客户端,比如 putty 和 xshell 我通常选择敬而远之。
    papa2
        95
    papa2  
       2020-07-04 21:40:04 +08:00 via iPhone   ❤️ 1
    楼主想通过提问知道到候选人知识面的广度和深度,那提问就需要开放式才对,对于很多候选人来说,给出最简单的原理和解决思路就好了,因为你提问就没用让人发散思维去回答,难道不回答就是没想到?
    miaowumiaowu
        96
    miaowumiaowu  
       2020-07-04 22:05:39 +08:00   ❤️ 1
    分享到了 bupt 系群里被喷成了筛子 TAT......于是不建议本校同学们投这个内推......感觉要是进去了上级会有点 particularly clueless, or negatively biased, or both......
    webassembly
        97
    webassembly  
       2020-07-04 22:14:06 +08:00
    我擦 咋就喷起来了。如果基础不够好,思维不够开放,这种面试体验可能会很差,楼主作为面试官确实是应该要适当的引导。但是单这篇文章来说,这个问题展开的过程是很棒的,我从中学会了一些解决问题的思路和根本不了解的知识点。
    tlday
        98
    tlday  
       2020-07-04 22:39:03 +08:00   ❤️ 1
    行文风格让我知道了这几个二维码的目标用户水平。
    不太喜欢知识密度这么低的技术文章,抱歉。
    22yune
        99
    22yune  
       2020-07-04 22:58:35 +08:00 via Android
    首先,楼主文章写的蛮好的;

    其次,下面喷的也有道理。

    希望大家发言都能尽量友善点。

    对于被评论的人,可以想一下,没有人针对谁,大家评论的是言论展示出的观点、态度或什么特质。不需要有被冒犯的感觉。
    Jat001
        100
    Jat001  
       2020-07-04 23:07:27 +08:00   ❤️ 1
    每个人的知识面都是有限的,这种 google 一下几分钟就能解决的事不知道可以换点别的问题问。

    说个今天遇到个面试,python 岗位。我不是科班出身,从来没系统地学过计算机科学,很多技术名词都没接触过,但这从来没妨碍过我写代码、完成任务,而且一般开发的时候也没人会交流这些东西。

    1. flask 的上下文
    我知道 app_context 这种东西,也知道什么时候用 current_app request session g 等变量,但你非要问我 flask 的上下文是干啥的,不好意思,我给不出一个教科书似的答案。

    2. 多态
    第一次听说,回头查了下,这不就是面向对象吗,我虽然不知道什么是多态,但我会写 class,知道什么是继承,也会用重载。

    3. 闭包
    我只听说过 js 里的闭包,一直认为这玩意跟匿名函数是一回事,平常也只用过 lambda,后来查了才知道有区别。

    就问了这三个问题就得出了一个我基础不行的结论,合着所谓的基础就是背技术概念吗。我平常遇到不知道的名词是会去看看,但我从来不背概念,因为写代码不需要背概念,知道什么时候用什么不就完了。pm 给我需求,我提供解决方案并实现,这才是我的工作,而不是向 pm 解释我的代码。

    最让我恶心的是,面试的时候另一个不负责问话的人一直在小声逼逼,“这都不知道”,“那还聊什么”,要不是问话的人比较客气,我 tm 都想怼他,你这么牛逼,那来说说 pytorch 跟 caffe 之间的区别是什么。虽然是远程面试,但他在那里逼逼啥我听得很清楚,有什么意见不能面试结束再聊?我估计旁边那个人是领导,问了这三个问题就结束了。

    回到楼主的问题,我 find 用得多比较熟,但我不会因为别人没用过 find 而觉得他技术不行,甚至很多开发都不用 unix 而是 windows,你问他们这问题有啥意义吗?而且 linux 下这么多命令你不看 manual 不看 help 能熟练用几个?就算天天用的命令你能马上告诉我每个参数代表什么吗?

    不要以为自己会点东西就觉得这是理所当然的,其他人也应该会,知识面越广才会发现未知的东西也越多,不知道不可怕,会点东西就沾沾自喜才可怕。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3042 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 13:57 · PVG 21:57 · LAX 05:57 · JFK 08:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.