M
Published on
· Last modified on
· Public

Unix下,请不要滥用*,尤其是关系重要数据的操作

今早一台机器的nginx数据库突然起不来,结果一看,根分区满载了,别说临时文件,连pid和lock的空间都没有了

顺便吐槽下某些国内IDC的奇葩做法,偷懒不用lvm直接用块文件分不说,sda只给了10G,而且更要命的是这10G里面还划走4G做swap

于是我把这swap给删除掉,然后创建了一个fakeusr作为挂载点,用来临时转运文件,我的做法是

mount /dev/sda2 /fakeusr
mv -f /usr/* /fakeusr/

然后这个过程中,不知什么原因,mv目标没打上的时候,就自动发出了,结果变成

mv -f /usr/*

我没在意,重新做了一遍

mv -f /usr/* /fakeusr/

然后照常卸载fakeusr,重新挂载usr,然后习惯性的ls了一下,瞬间惊呆

ls -al /usr
total 28
drwxr-xr-x 4 root root 4096 Jul 22 05:47 .
dr-xr-xr-x. 23 root root 4096 Jul 22 06:03 ..
drwx------ 2 root root 16384 Jul 22 05:40 lost+found
drwx------. 17 nginx root 4096 Jul 22 05:47 uwsgi_temp

尼玛usr/local /usr/share等一堆东西被移到异次元去了???

但是df 反馈的可用空间并没有变大,根据能量守恒定律,文件不可能凭空消失,于是开始了漫长的搜寻

find . -name local

等待了许久,结果出来了,usr里的所有东西,都跑到/usr/uwsgi_temp里去了,还好我没有清理tmp...

于是,再从uwsgi_temp里把文件mv出来,完成...

但是为啥mv会把文件移到异次元空间呢,我查了下,这来源于shell的一个致命缺陷

命令中,*并不是由目标命令去出来,而是由shell去处理,这样就导致了...

你敲一个mv /usr/*,shell会自动展开为:

mv /usr/bin /usr/etc /usr/games /usr/include /usr/lib /usr/lib32 /usr/lib64 /usr/libexec /usr/local /usr/portage /usr/sbin /usr/share /usr/uwsgi_temp 

所以东西都被移到了最后一个文件夹,即/usr/uwsgi_temp

所以,在可能会影响系统的情况下,请慎重在参数里使用 *

C
Published on

hello test

P
Published on

tks :D

Sign in or Sign up Leave Comment