我今天被flock的子进程可以继承父进程的锁的这个特性坑到了,所以做一个记录,大家不要和我一样被这个坑到。
示例
写3个简单的shell代码:
fd_in_parent.sh(没错,这种方式是锁不了子进程的)
#!/bin/bash
exec 200<>lock.txt
(
flock -x 200
echo "a sleep start"
sleep 20
echo "a sleep over"
flock -u 200
) &
sleep 5
(
flock -x 200
echo "b sleep start"
sleep 5
echo "b sleep over"
flock -u 200
) &
wait
exec 200>&-
fd_in_sub.sh
#!/bin/bash
(
flock -x 200
echo "a sleep start"
sleep 20
echo "a sleep over"
flock -u 200
) 200<>lock.txt &
sleep 5
(
flock -x 200
echo "b sleep start"
sleep 5
echo "b sleep over"
flock -u 200
) 200<>lock.txt &
wait
fd_in_sub2.sh
#!/bin/bash
(
exec 200<>lock.txt
flock -x 200
echo "a sleep start"
sleep 20
echo "a sleep over"
flock -u 200
) &
sleep 5
(
exec 200<>lock.txt
flock -x 200
echo "b sleep start"
sleep 5
echo "b sleep over"
flock -u 200
) &
wait
运行结果是这样的(运行前先touch lock.txt):
注意这里,fd_in_parent.sh的b,竟然在a结束之前就获得到锁了!
所以以后如果要做多进程同步的事的话,注意文件描述符不要在父进程打开!要不然你根本锁不了子进程!
结论
要做多进程同步操作时,文件锁对应的文件,一定要在子进程里打开!