1

Я пытаюсь написать сценарий для школьного задания, который проверит и увеличит ли размер каких-либо домашних каталогов пользователей без прав администратора более чем на 100 МБ за один 20-минутный период.

Если какой-либо из домашних каталогов пользователей увеличился более чем на 100 МБ, отправьте root по электронной почте. Это должно быть автоматизированной рутиной.

Это то, что я сделал до сих пор:

#!/bin/bash
#

DIR=`ls -d /home/*`
Size=0
for DIR in $DIR
do
   Size[index]=`du -skh ${DIR}`

done

 while sleep 5; do      
   for DIR in $DIR
  do
    NEW_SIZE=0
    NEW_SIZE=`du -skh ${DIR} `
    DIFF=$((SIZE-NEW_SIZE))
    echo $DIFF  
      if [ $DIFF -eq 0 ]
      then
          mail -s "Subject" root
     fi

    done
done

но я получаю следующую синтаксическую ошибку:

Ошибка: строка 19: 580 КБ: слишком большое значение для базы (токен ошибки "580 КБ")

Что я делаю неправильно?

2 ответа2

1

Много вопросов:

  • for DIR in $DIR изменяется значение $DIR .  Это может сработать в первый раз, но при втором выполнении этого оператора $DIR будет последним каталогом в /home , а не всем списком.
    • Почему бы просто не сказать for DIR in /home/*?
  • index никогда не устанавливается.
  • Это безвредно, но нет причин устанавливать NEW_SIZE=0 непосредственно перед установкой NEW_SIZE другого значения в следующей строке.
  • SIZE никогда не устанавливается.

Возможно, вы захотите изучить некоторые элементарные методы отладки.

0

Пара указателей:

  1. du -skh ${DIR} выдаст что-то, похожее на 23M Example/ , тогда как вы, вероятно, захотите, чтобы это было просто число, которое вы потом сможете вычислить. Возможно, используйте cut чтобы удалить имя каталога, и не используйте -h, потому что вы хотите, чтобы число читалось компьютером, а не число, читаемое человеком.

  2. DIFF=$((SIZE-NEW_SIZE)) выглядит неправильно. Попробуйте DIFF=`expr $NEW_SIZE - $SIZE`

  3. Затем вы, вероятно, захотите проверить значение DIFF в сравнении с чем-то вроде 100 МБ, то есть 100000000 байт (более или менее): [[ $DIFF -ge 100000000 ]] "" если значение DIFF больше или равно 100000000 байт… "

Это будет зависеть от вашей ОС, особенно от флагов для теста. Я не могу вспомнить, какой, но я думаю, что Mac использует -g больше, чем, в то время как Linux использует -gt. Я думаю, что всегда больше или равно. Погугли это.

Возможно, было бы проще сохранить размеры каталогов для каждого 20-минутного среза в файле журнала, а также добавить скрипт в файл журнала и сравнить его с предыдущей записью журнала. Тогда вы можете запускать его как прямолинейное занятие, а не как постоянную работу while sleep . Может быть немного более безобразие вокруг, хотя.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .