[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jun 2005
    Beiträge
    17

    Question QShell: Dateien älter als 10 Minuten finden

    Hallo Forum,

    unsere AS/400 (V7R1M0) stellt Dateien in einem IFS-Verzeichnis zur Verfügung, die dann von einem anderen Server abgeholt und gelöscht werden. Für den Fehlerfall habe ich ein Überwachungsscript geschrieben, das periodisch aufgerufen wird und prüfen soll, ob Dateien in dem Verzeichnis stehen, die älter als 10 Minuten sind:

    Code:
    #!/QopenSys/bin/sh
    
    # Limit in Minuten für Alter der Dateien
    TIMEOUT=10
    
    
    # Zu Überwachendes Verzeichnis
    ERPDIR=/var/lib/hmg/kss/transfer/2-$1/*
    
    
    # Anzahl vorbelegen
    ANZAHL=-1
    
    
    # Ermittle Anzahl zu alter Dateien
    ANZAHL=`find $ERPDIR -mmin +$TIMEOUT -type f | wc -l | sed 's/ //g'`
    LISTE=`ls -o $ERPDIR`
    GROESSE=`ls -l $ERPDIR | awk '{ SUM += $5} END { print SUM }'`
    typeset -L512 MSGTEXT
    MSGTEXT="Diagnose:
    - Kassen nicht aktuell
    - Verzeichnis: $ERPDIR
    - Anzahl Dateien: $ANZAHL
    - Älter als: $TIMEOUT Minuten
    - Grösse: $GROESSE Bytes
    
    
    Aktion:
    - Second Level Support informieren
    
    
    Dateiliste:
    $LISTE"
    
    
    if [ $ANZAHL -gt 0 ]
      then
        system "sndemail recipient('...') subject('...') msgtext('$MSGTEXT')"
    fi
    exit
    Leider funktioniert der Find-Befehl nicht, wie von Unix gewohnt (http://unixhelp.ed.ac.uk/CGI/man-cgi?find), mit dem Parameter "-mmin" um das Änderungsdatum im Minutenbereich abzufragen.

    Kann mir jemand unter die Arme greifen?

    Gruß,
    Frederik

    P.S. Vielen Dank für diese tolle Forum! Es ist mir immer wieder eine große Quelle von Informationen und Tipps.

  2. #2
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    guckst du hier
    Gruß
    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  3. #3
    Registriert seit
    Jun 2005
    Beiträge
    17
    Hi Robi,

    danke, aber die Seite habe ich auch gefunden. Leider ist das genau mein Problem, denn es gibt dort keinen Parameter um Änderungen im Minutenbereich zu finden; lediglich Tage sind möglich. Das reicht mir aber nicht...

    Gruß,
    Frederik

  4. #4
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    genau!
    also den find in eine Datei umleiten und selber prüfen.
    Ich mach das aber dann mit CLLE oder RPG. QSH ist mir da zu wuselig
    Robi

    oder
    statt find, LS verwenden aber auch da ist keine selektion möglich
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  5. #5
    Registriert seit
    Aug 2006
    Beiträge
    2.077
    und hilft Dir der Parameter weiter?

    -newer fileTrue if the current file has a more recent last modification time than file.
    GG

  6. #6
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    könnte gehen,
    dann must du immer nach der suche mit touch eine Datei erstellen
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  7. #7
    Registriert seit
    Jun 2001
    Beiträge
    1.975
    Nein, das hilft doch nicht. du weist dann nur . das die Dateien danach gekommen sind, nicht das sie schon 10 Minuten alt sind!

  8. #8
    Registriert seit
    Jun 2005
    Beiträge
    17
    So, für alle, die es interessiert: ich habe jetzt die Qshell über Bord geworfen und die Lösung in RPG umgesetzt.

    Dabei hat mir das Tutorial von Scott Klement sehr geholfen:
    http://www.scottklement.com/rpg/ifs_ebook/

    Wenn jemand Fragen dazu hat, kann ich sie gerne beantworten.

    Danke nochmals, für dieses tolle Forum!

    Gruß,
    Frederik

    Code:
    h decedit('0,') datfmt(*iso) datedit(*dmy.)
    h dftactgrp(*no) actgrp(*new) bnddir('QC2LE') bnddir('IFSTEXT')
     //
    d/copy tools/qrpgleh,ifsio_h
    d/copy tools/qrpgleh,ifstext_h
    d/copy tools/qrpgleh,errno_h
     //
    d finr            s              2a
    d dir             s               *
    d dirname         s             50a
    d filename        s             50a
    d txtname         s             50a   inz('/tmp/hmg/kss/dateiliste.txt')
    d modtime         s               z
    d filetime        s               t
    d filedate        s               d
    d akttime         s               t
    d aktdate         s               d
    d fnwithdir       s            100a
    d mystat          s                   like(statds)
    d hours_utc       s             10i 0
    d mins_utc        s             10i 0
    d secs_utc        s              8f
    d epoch           s               z   inz(z'1970-01-01-00.00.00.000000')
    d utcoffset       s             10i 0
    d zeile           s             80a
    d anzahl          s             10i 0
    d groesse         s             10i 0
    d openflag        s              5i 0
    d fd              s             10i 0
    d line            s             80a
    d linelen         s             10i 0
    d err             s             10i 0
     //
    d stm             s           1000a
    d len             s             15p 5
     //
    d ceeutco         pr
    d hours_utc                     10i 0
    d mins_utc                      10i 0
    d secs_utc                       8f
    d feedback                      12a   options(*omit)                       UTC Offset
     //
    dqcmdexc          pr                  extpgm('QCMDEXC')                    Systemaufruf
    d stm                         1000a   options(*varsize) const
    d len                           15p 5 const
     //
    c     *entry        plist
    c                   parm                    finr
     //
     /FREE
      //-----------------------------------------------------------------------
      // Hauptprogramm
      //-----------------------------------------------------------------------
      akttime = %time();
      aktdate = %date();
      dirname = '/var/lib/hmg/kss/transfer/2-' + finr + '/';
      
      ceeutco(hours_utc: mins_utc: secs_utc: *omit);                         //UTC Offset holen
      if %error;
        utcoffset = 0;
      else;
        utcoffset = secs_utc + 3600;                                         //Eine Stunde drauf, sonst falsch?!
      endif;
    
      dir = opendir(%trimr(dirname));
      if dir = *NULL;
        die('opendir(): '+%str(strerror(errno)));
      endif;
    
      anzahl = 0;
      groesse = 0;
      zeile = '';
      filename = *blanks;
      p_statds = %addr(mystat);
      p_dirent = readdir(dir);
      dow p_dirent <> *NULL;
        filename = %subst(d_name:1:d_namelen);
        fnwithdir = %trimr(dirname) + %trimr(filename);
        if %subst(filename:1:1) <> '.';                                      //Verzeichnis?
          if stat(%trimr(fnwithdir): %addr(mystat)) < 0;
            die('stat(): '+%str(strerror(errno)));
          endif;
          modtime = epoch + %seconds(st_mtime) + %seconds(utcoffset);
          filedate = %date(modtime);
          filetime = %time(modtime);
          if (filedate < aktdate)                                            //Datum < Tagesdatum
            or ((filedate = aktdate)                                         //oder Datei von heute
            and (%diff(akttime : filetime : *minutes) > 10));                //aber älter als 10 min
            anzahl = anzahl + 1;
            groesse = groesse + st_size;
            if openflag = 0;                                                 //Datei noch nicht offen?
              if unlink(%trimr(txtname)) < 0;                                //Datei erst mal löschen
                err = errno;
                if err <> ENOENT;
                  callp die('unlink(): ' + %str(strerror(err)));
                endif;
              endif;
              fd = open(%trimr(txtname):                                     //Anlegen mit richtiger Codepage
                   O_CREAT+O_WRONLY+O_CODEPAGE:
                   S_IWUSR+S_IRUSR+S_IRGRP+S_IROTH:
                   819);
              if fd < 0;
                callp die('open(): ' + %str(strerror(errno)));
              endif;
              callp close(fd);
              fd = open(%trimr(txtname):                                     //Öffnen als Text-Datei
                   O_WRONLY+O_TEXTDATA);
              if fd < 0;
                callp die('open(): ' + %str(strerror(errno)));
              endif;
              line = %trimr(dirname);
              linelen = %len(%trimr(line));
              callp writeline(fd: %addr(line): linelen);                     //Verzeichnisnamen schreiben
              line = ' ';
              linelen = %len(%trimr(line));
              callp writeline(fd: %addr(line): linelen);                     //Leerzeile schreiben
              openflag = 1;
            endif;
            line = filename + ' ' + %char(filedate) + ' ' +
                    %char(filetime) + ' ' + %char(st_size);
            linelen = %len(%trimr(line));
            callp writeline(fd: %addr(line): linelen);                       //Dateizeile schreiben
          endif;
        endif;
        p_dirent = readdir(dir);
      enddo;
      closedir(dir);
      if openflag = 1;
        callp close(fd);                                                     //Textdatei schliessen
      endif;
      if (anzahl > 0);
        exsr ticket;
      endif;
      *inlr = *on;
    
    
      //-----------------------------------------------------------------------
      // Ticket schreiben
      //-----------------------------------------------------------------------
      begsr ticket;
        stm = 'SBMJOB CMD('                                                  //Ticket Mail senden
          + 'IEFFECT/SNDEMAIL '
          ...
        qcmdexc(stm: %size(stm));
      endsr;
    
    
      //-----------------------------------------------------------------------
      // Programminit
      //-----------------------------------------------------------------------
      //
      begsr *inzsr;
      endsr;
      //
     /END-FREE
     //
     /DEFINE ERRNO_LOAD_PROCEDURE
     /COPY TOOLS/QRPGLEH,ERRNO_H

Similar Threads

  1. Source in Bibliothek finden!
    By VWBussi in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 24-08-12, 09:34
  2. doppelte Sätze finden = > SQL
    By heynem in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 05-12-02, 08:59
  3. DUPSPLF nicht zu finden
    By Sascha in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 09-07-02, 09:08
  4. NEWSboard Beiträge schneller finden
    By Burgy Zapp in forum NEWSboard Server & Hardware Markt
    Antworten: 0
    Letzter Beitrag: 22-03-02, 22:48
  5. Dateien mit mehreren Teildateien finden
    By Frank.Sobanek in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 29-08-01, 14:11

Tags for this Thread

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •