过去几个月使用 bash 进行一些自动化处理的时候,出现了2次悲剧,辛辛苦苦跑的数据被 rm -rf 掉了。
第一个悲剧:
简化之后的代码如下,少了注释中的那行代码,结果十几个数据文件就只剩下来了一个。
第二个悲剧:
这个更悲剧,丢失的是跑了1个月的所有数据。之后重新运行了一个月才彻底恢复过来。涉及的问题有2个脚本:
脚本1:
脚本2:
两个脚本同时运行。脚本2作为监控脚本来防止 $somedir 太大(因为测试的程序有时候会死循环的往文件里面写东西)。当检测到过大时就直接删除掉。当脚本1在$somedir上进行操作的时候,脚本2没打招呼的把$somedir删除了。导致了脚本1的pushd失败。于是,删除了错误目录下的所有文件(因为没有加 -r 选项所以目录没有被删除)。
悲剧还没有结束。当 pushd 失败,当前目录下也没有文件了之后,$i 的值就是 ‘*’。而原来的脚本1中还有一行类似这样的语句:
out_put_something > backups/$i
eval 之后得到的语句是
out_put_something > backups/*
结果,backups/目录下所有的文件内容都被覆盖了。
教训:
1.脚本之间进行目录操作的时候一定要小心。rm -rf 命令也要小心。
2.脚本中的每一条语句都要考虑失败的情况。
3.使用变量作为文件名的时候需要加双引号(”)。
4.在工作脚本中直接进行备份不靠谱。