我谨慎地使用了rm -fr,为什么还是导致了灾难?
首先我们得明白, rm -fr
的意思, rm
即为删除,-r
表示--recursive
,递归的,简单地理解为一切的。-f
表示--force
, 就是强制性的意思,不需要经过你的确认。
比如 rm -fr /home/wandering513/
就表示删除家目录下的wandering513这个文件夹,但如果,你是一个激情洋溢的程序猿,再输入rm -fr /
之后就敲入了回车….,这样就可能引发灾难。
前几个礼拜,我朋友圈里的各大技术公众号,纷纷在推送一个新闻,那就是Gitlab这家公司,因为错误的rm -fr操作,删掉了数据库目录,虽然进行了一系列补救措施,但最终Gitlab仍然丢掉了差不多6个小时的数据。之所以产生这个重大的技术事故,是因为Gitlab这个公司犯了两个致命的错误。第一个是运维人员是在生产环境上输入的删除数据库的命令, 另外一个是该公司的恢复数据时5种机制全部失效。其实这种问题,怨不得谁。就像泰坦尼克号,如果不是因为太多的舱进水,如果只是某个船舱进水,它仍然会保持漂浮而不至于沉没。
至于前年的携程宕机事故,原因更为离奇,据说是某个运维小哥,女朋友跟某公司高管好了,冲冠一怒为红颜,把公司的rm -fr /
把公司的根目录给删了,但这是据说而已,大家切勿当真。最后携程公司发布公告,经携程技术排查,确认此次事故是由于员工错误操作所导致,和外界猜测的相符合。
还有一个也是跟rm -fr
相关的,更加忧伤的故事。有一个程序猿错误地使用了rm -fr /
操作,把一家公司给删没了…,这个哥们比上面的两个要聪明一点点,没有直接在命令行里删除。而是写了一个bash脚本,但是一个有问题的bash脚本… ,他想执行的是 rm -fr {foo}/{bar}
, foo和bar是脚本中动态传递的两个变量。然而由于变量处理出错,通用语法未能成功地在bash中插值,所以最终的指令就变成了灾难性的rm -fr /
,不仅删除了全部文件,并且把备份也删了。
最后这个小哥在网上发帖求助,大家只能安慰他,并且劝他请个好律师,这样赔得少点。
好像这些事离我们都很遥远,但是我的身边,包括我自己确实实实在在地经历过这样的事。
刚进入实验室的时候,就听说三师兄把大师兄的的主目录全部删掉了,事情这个样子的,三师兄去大师兄home目录下,打包拷东西,并且建了个文件夹还是怎么着,然后拷完之后,在删除自己建的文件的时候,不小心输入了rm -fr .
, 这个命令把大师兄做进化两个多月,画的各种进化树全删了,后来大师兄转NGS方向,现在在美国做博后,据说还挺感谢三师兄当年删了他的家目录。
当初我听到这个消息,我的心情是这样的。
没过多久,这件事就发生在了自己的身上,囧。事情是酱紫的,实验室的二师兄向来神通广大,以收集各种难找的参考基因组,注释文件闻名,有一天我找他要一个物种的参考基因组。师兄直接给我ln -s /his_path/genome /home/ztxu/softlink
, 在我的目录下建了一个软连接。而当这个活做完之后呢,作为一个强迫症患者,不允许自己的主目录下有杂七杂八的东西,所以删除了软连接,大家看好了啊。
我的操作是 rm -fr softlink/
,作为一个激情洋溢的半程序猿,总喜欢自动补全。 这下子把师兄原来的genome下的文件全删了!!!,隔了半月,师兄在群里说,谁把我文件夹删了? 这件事惊动了老板。 后来我反复测试,之后弄清楚了原委,然后主动自首,幸好师兄有备份,这场风波才这么过去。
如果我当初的操作是rm -fr softlink
, 那没事,就是删除了softlink这个软链接。但我多输入了一个rm -fr softlink/
,那就坏事了,这个操作是把软连接指向的原链接下的东西全部删光!
这件事情,导致了我们实验室的权限改革,每个人的家目录只能自己可读可写可执行; 公共目录里,大家只能读。并且,各位看客要明白一个道理:今后谨慎地给菜鸟建软连接!!!并且自己的重要文件,比如脚本,pipeline 之类的东西,多弄几个备份。
最后,希望大家能够明白,rm -fr
的严重后果,谨慎使用。同时,大家不要在自己的家目录下测试这里面我提到的东西,不然大家自行负责~
最后,祝大家节日快乐~