Aşırı Kullanıcı Giriş Dizini Büyümesini İzleme


1

Yönetici olmayan kullanıcı ana sayfa dizinlerinin herhangi birinin 20 dakikalık bir sürede 100 MB'tan daha fazla artmış olup olmadığını kontrol edecek ve görecek bir okul ödevi için bir senaryo yazmaya çalışıyorum.

Kullanıcıların ana dizinlerinden herhangi biri 100 MB'tan daha fazla artmışsa, kökü bir e-posta ile gönderin. Bunun otomatik bir rutin olması gerekir.

Şimdiye kadar yaptığım şey buydu:

#!/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

ancak aşağıdaki sözdizimi hatasını alıyorum:

Hata: Satır 19: 580K: taban için çok büyük değer (hata belirteci "580K" dir)

Neyi yanlış yapıyorum?

Yanıtlar:


1

Birçok konu:

  • for DIR in $DIRdeğerini değiştirir $DIR. Bu ilk seferde işe yarayabilir, ancak bu ifadeyi ikinci çalıştırdığınızda, listenin tamamı değil, son dizin $DIRolacaktır . /home
    • Neden sadece söylemiyorsun for DIR in /home/*?
  • index asla ayarlanmadı.
  • Bu zararsızdır, ancak bir sonraki satırda başka bir değere ayarlamadan NEW_SIZE=0hemen önce ayarlama NEW_SIZEyapmak için bir neden yoktur .
  • SIZE asla ayarlanmadı.

Bazı temel hata ayıklama tekniklerini öğrenmek isteyebilirsiniz.


0

Birkaç işaretçi:

  1. du -skh ${DIR}benzeyen bir şey üretecektir 23M Example/, oysa muhtemelen daha sonra hesaplayabileceğiniz bir sayı olmasını istersiniz. Belki cutdizin ismini silmek için kullanabilirsiniz ve -h kullanmayın, çünkü bir bilgisayar tarafından okunabilir bir numara istiyorsunuz, bir insan tarafından okunabilir numara değil.

  2. DIFF=$((SIZE-NEW_SIZE))doğru görünmüyor DeneyinDIFF=`expr $NEW_SIZE - $SIZE`

  3. O zaman, DIFF değerini 100 MB, yani 100000000 bayt (az ya da çok) gibi bir şeye karşı test etmek istersiniz: [[ $DIFF -ge 100000000 ]]"DIFF değeri 100000000 bayta eşit veya daha büyükse ..."

Bu, işletim sisteminize, özellikle de testin bayraklarına bağlı olacaktır. Hangisini hatırlayamıyorum ama Mac'in -g'yi -gt'den daha büyük kullandığını düşünüyorum. -Gen her zaman eşit veya daha büyük olduğunu düşünüyorum. Google'a sor.

Belki de her 20 dakikalık dilim için dizin boyutlarını bir günlük dosyasına koymak ve betiğinizin günlük dosyasına ekleyip önceki günlük girdisiyle karşılaştırması daha kolay olacaktır. O zaman, sürekli bir while sleepişten ziyade dürüst bir cronjob olarak koşabilirsin . Gerçi biraz daha faff olabilir.


bana expr verdi: sözdizimi hatası
mKay

Bunun nedeni ham rakamları vermemeniz olabilir. Expr'i kendi başına kullanmayı deneyin. Enter expr 10 - 8, geri dönmesi gerekiyor 2. Şimdi expr 10MB dir1/ - 25MB, betiğinizin görünümünden kabaca eşdeğer olana girmeye çalışın . Sözdizimi hatası.
Jangari
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.