Попробуйте команду flock:
exec 200>"$LOCK_FILE"
flock -e -n 200 || exit 1
Он выйдет, если файл блокировки заблокирован. Он атомарный и будет работать над последней версией NFS.
Я сделал тест. Я создал файл счетчика с 0 и выполнил следующее в цикле на двух серверах одновременно 500 раз:
#!/bin/bash
exec 200>/nfs/mount/testlock
flock -e 200
NO=`cat /nfs/mount/counter`
echo "$NO"
let NO=NO+1
echo "$NO" > /nfs/mount/counter
Один узел сражался с другим за блокировку. По завершении обоих запусков содержимое файла составило 1000. Я пробовал несколько раз, и это всегда работает!
Примечание. NFS-клиент - RHEL 5.2, а используемый сервер - NetApp.