Я пытаюсь перенести сценарий Linux bash на FreeBSD.Сценарий должен проверить, открыт ли файл (для записи), прежде чем решить, следует ли предпринять какое-либо действие.
В Linux это было легко с помощью команды fuser
:
if [[ ! `/usr/bin/fuser "$FILE"` ]]
then
...
fi
Однако во FreeBSD команда fuser
кажется полностью неработающей (подтверждается this ) и не возвращает никаких правильных кодов выхода или действительно полезных выходных данных для stdout.Например, для файла, который активно записывается в:
# fuser file
file:
Редактировать:
Комментарий Владимира Ботки:
«Показывает простой тест во FreeBSD 12.0»:
# tail -f /scratch/test-file`
# fuser /scratch/test-file
/scratch/test-file: 45042
# echo $?
0
# ps ax | grep 45042
45042 0 I+ 0:00.00 tail -f /scratch/test-file
45232 1 R+ 0:00.00 grep 45042
На моем компьютере с FreeBSD (также FreeBSD 12) этот же тест дает следующее:
# tail -f /scratch/test-file
# fuser /scratch/test-file
/scratch/test-file:
# echo $?
0
Комментарий Владимира Ботки:
Давайте попробуем проверить запись в файл с помощью простой программы на C, которая открывает файл, ожидает ввода и записывает ввод в файл.
Вот мой тест на скомпилированном коде C:
# ./a.out
Enter num:
# fuser /scratch/test-file
/scratch/test-file:
# echo $?
0
Следовательно, fuser
, похоже, не работает.Тем не менее, он кажется только сломанным в моей системе, а не в системе Владимира Ботки, что странно, поскольку они оба FreeBSD 12.
Кажется, я мог бы использовать lsof
или fstat
, чтобы получитьэта информация, но не без какого-либо сложного анализа выходных данных, что сделает мой сценарий более сложным.Я задавался вопросом, может ли кто-нибудь указать мне на простую команду «да / нет», чтобы определить, используется ли файл, такой как fuser
, который будет работать во FreeBSD?
Большое спасибо,