Я хочу создать сценарий, в котором мне нужно назначить MAXAVAILSIZE дискового пространства. И когда размер Avail больше или равен MAXAVAILSIZE, файлы журналов будут сжаты.
Example:
Filesystem Size Used Avail Use% Mounted on
tmpfs 20G 4.0K 16G 89% /secrets/gateway-public
MAXAVAILSIZE=16G
AVAILSIZE=`findmnt -no Avail /secrets/gateway-public`
echo "MAXAVAILSIZE is $MAXAVAILSIZE"
echo "AVAILSIZE is $AVAILSIZE"
if [ "${AVAILSIZE}" -ge "${MAXAVAILSIZE}" ]; then
echo "mounted"
gzip test_202401*
else
echo "not mounted"
fi
Каждый раз, когда я запускаю этот скрипт, значение размера файла Avail, которое я получаю, составляет 15,7 ГБ, что не совпадает с тем, которое показано при использовании df -h.
Кроме того, я получаю строку ошибки 64: [: 15.7G: в этой части ожидается целочисленное выражение:
if [ "${AVAILSIZE}" -ge "${MAXAVAILSIZE}" ]; then
Могу ли я узнать, как мне это решить?
Значения не одинаковы, поскольку разные утилиты используют разный формат и точность вывода. Чтобы получить целое число доступных блоков по 1 тыс., вы можете использовать, например, AVAILSIZE=$(df -k --output=avail /secrets/gateway-public | tail -n 1)
Я не понимаю логики [ "$AVAILSIZE" -ge "$MAXAVAILSIZE" ] && gzip test_202401*. Зачем вам сжимать файлы, если доступно больше места, чем пороговое значение? Кроме того, почему эти файлы кажутся не связанными с точкой монтирования?
@Fravadona, наш сервер в этой точке монтирования всегда заполнен дисковым пространством. Наше решение — сжать некоторые файлы журналов. Вместо того, чтобы вручную проверять df -h и сжимать файл. Я подумывал создать сценарий, чтобы, если размер пространства использования достигал этого определенного размера, он автоматически сжимал файлы журналов.





Учитывая ваши объяснения, условие запуска сжатия неверно; вам следует проверить, что доступное пространство составляет менее 16 ГБ.
Кроме того, арифметика с плавающей запятой не является стандартной в оболочке, поэтому вам следует избавиться от «удобочитаемых» размеров и использовать целые числа с меньшими единицами.
Вот что я бы сделал:
mountpoint=/secrets/gateway-public
minavailsize=$((16*1000*1000*1000/1024)) # 16GB expressed in KiB
availsize=$(df -kP "$mountpoint" | awk 'NR == 2 {print $4}')
if [ -z "${availsize:+1}" ] # the output of df was empty
then
echo "not mounted"
else
echo "mounted"
[ "$availsize" -lt "$minavailsize" ] && gzip "$mountpoint"/test_202401*
fi
Могу ли я задать вопрос по этому поводу [ "$availsize" -lt "$minavailsize" ] && gzip "$mountpoint"/test_202401*? Это условие if? если размер файлаavailize меньше, чем размер minavailsize, он будет сжат с помощью gzip?
В сообщении об ошибке четко указано, что не так.
15.7Gне является целым числом, как и16G. Их нельзя сравнивать с оператором-ge.