在工作中用crontab通过bash处理数据的时候,发现了这个问题,事情是这样的。
我用crontab没两分钟,把数据导出来,放在一个临时文件当中,代码模拟如下
echo "select * from A" | mysql -uroot database -N > tmp cat tmp | while read a b c; do #处理一些业务逻辑 done echo "truncate A" | mysql -uroot database
大致的流程如上,但是中间处理业务逻辑的部分太长了,导致下一个crontab处理时还没有处理玩当前的crontab,crontab相互之间是不会影响的,但是生成的文件确实替换的。
这就导致了在下一个cat执行时,tmp文件已经被重新写入了,于是,再cat 时已经报错了,我大胆提出假设,替换命令是线程不安全的
后来我写了一个测试方法
1 i=0; 2 while [ $i < 3 ] ; do 3 echo ·"$1_$i" 4 i=$(($i+1)) 5 sleep 1 6 done > T
这是一个写入的方法,通过单独调用分别传A B C 值进去
另外写一个一直读取T的方法,我本以为,T文件当中要么全显示A_0 A_1 A_2,要么全是B,或者C,但是,没有想到的是 竟然出现了 A_2 B_1 C_0 类似这样的内容,实在让人很不解,果然,是线程不安全的,但是为什么什么时候写都只有3行也让人疑惑
可能没有表达清楚,第一次写文章没有怎么整理,如果有网友明白其中原因,希望能够不吝赐教,十分感谢
浙公网安备 33010602011771号