V11.2: File-Event - !Script - PREP_PROCESS - UNIXCMD

Manfred MauermannManfred Mauermann NürnbergPosts: 93 Explorer ✭✭
Hallo Zusammen,

wir nutzen die Funktion, falls wir für einen Jobplan mehr als eine Eingabedatei benötigen bzw. diese bestimmte Eigenschaften erfüllen muss. Läuft z.B. mit einem "find ...." einwandfei.

Beispiel:
: PSET    &result#   = ''
: SET     &datumhnd# = PREP_PROCESS(&host#,"UNIXCMD","*","CMD=find &in_absolut# -name &inputpattern# -mmin +61",,"UC_LOGIN=UNIX_UC4")
: PROCESS &datumhnd#
: PSET    &result#   = GET_PROCESS_LINE(&datumhnd#)
: ENDPROCESS
: PRINT   'Ergebnis:&result#'
: CLOSE_PROCESS &datumhnd#

Und nun dachte ich mir, ersetze ich für einen anderen Fall mal den "find" durch einen "ls -lt &dateiname#".
Das funktioniert nun leider nicht!

Detail:
EVNT.CLNG#BSL@FILEEXISTS (494735226)
      Allgemein
          Objektname    EVNT.CLNG#BSL@FILEEXISTS
          Version    0
          RunID    494735226
          Aktivierer    494736022
          Parent    494736022
          Benutzer    ******
          Aktivierung    13.07.2016 08:14:44
          Start    13.07.2016 08:14:44
          Ende    13.07.2016 08:14:52
          Laufzeit       0:00:08
          Status    FAULT_OTHER - Start nicht möglich. Sonstiger Fehler.
          Rückgabewert    0
          Letzte Meldung    U00010038 Laufzeitfehler: Datensequenz 'FILETRANSFER' konnte nicht erstellt werden. Status: '0000001820', Rückgabewert: '0000000000'.
          Event-ID    494736022
          Rollback ermöglichen    Nein

1820 bedeutet: FAULT_OTHER Vorgängeraufgabe konnte wegen eines sonstigen Fehlers nicht gestartet werden.

Hat da schon mal jemand ähnliche Erfahrungen gemacht? Ich hab weder in der Doku noch im Objekt "0000\ PREP_PROCESS\EVENT.UNIXCMD" Hinweise auf mögliche Einschränkungen gefunden.

Vorab vielen Dank und viele Grüße aus Nürnberg
Manfred




Comments

  • Manfred MauermannManfred Mauermann NürnbergPosts: 93 Explorer ✭✭
    Ok, ich hab nochmal getestet und genau hingeschaut, somit kann ich mir die Frage nun selbst beantworten.

    Der ls funktioniert natürlich wie jedes andere Kommando auch. Nur dummerweise liefert der ls, wenn er nichts findet einen RC<>0, was dann zum Fehler bei UC4 führt. Somit ist der find für den PREP_PROCESS besser geeignet, weil dieser im Negativ-Fall nichts zurückliefert und man einfach die Ergebnis-Variable auf Erfolg/Mißerfolg abfragen kann. Beim ls gibts dagegen den Abbruch mit dem Zielführenden Fehlerhinweis B)

    Ich lass das jetzt hier trotzdem mal stehen, vielleicht hat ja jemand noch Anregungen dazu oder das Thema hilft anderen.

    Viele Grüße
    Manfred
  • Christian BoeckChristian Boeck Senior Manager Application Process Automation / IT Infrastructure Services MuenchenPosts: 31 Journeyman ✭✭✭
    edited July 2016
    Hi Manfred,

    was genau möchtest Du denn mit dem LS dann erreichen ? nur eine Fileliste ? Dafür könntest Du ja dann auch einfach nur
    prep_process_filename  nutzen.

    Viele Grüße
    Christian
  • Manfred MauermannManfred Mauermann NürnbergPosts: 93 Explorer ✭✭
    Hi Christian,
    der ursprüngliche Plan war, da wir drei Dateien mit demselben Zeitstempel benötigen, das mit einem
    ls *zeitstempel* | wc -l
    abzufragen und dann das Ergebnis des PREP_PROCESS auf eben 3 abzufragen. Klappt leider nicht wunschgemäß, wenn gar keine Datei vorhanden ist.

    Wir haben jetzt eine pragmatische Lösung mit drei Abfragen, das funktioniert einwandfrei. Eleganter könnte man das sicher auch noch mit einem Skript auf dem Agent erledigen. Noch pfiffiger, Script generieren, übertragen und ausführen:) Der Phantasie sind da ja kaum Grenzen gesetzt.

    !Script:

    : PSET    &result#        = 'N'

    : SET     &datumhnd#    = PREP_PROCESS(&host#,"UNIXCMD","*","CMD=find &in_absolut# -name &inputpattern#",,"UC_LOGIN=UNIX_UC4")
    : PROCESS &datumhnd#
    : PSET    &result1#     = GET_PROCESS_LINE(&datumhnd#)
    : ENDPROCESS
    : PRINT   'Ergebnis1:&result1#'
    : CLOSE_PROCESS &datumhnd#

    : IF &result1# <> ''
    :   SET     &inputpattern2# = STR_SUB ( &inputpattern2#, "JJJJMM", &UDAT_JJJJMM# )
    :   SET     &datumhnd2#  = PREP_PROCESS(&host#,"UNIXCMD","*","CMD=find &in_absolut# -name &inputpattern2#",,"UC_LOGIN=UNIX_UC4")
    :   PROCESS &datumhnd2#
    :   PSET    &result2#   = GET_PROCESS_LINE(&datumhnd2#)
    :   ENDPROCESS
    :   PRINT   'Ergebnis2:&result2#'
    :   CLOSE_PROCESS &datumhnd2#
    :   IF &result2# <> ''
    :     SET     &inputpattern3# = STR_SUB ( &inputpattern3#, "JJJJMM", &UDAT_JJJJMM# )
    :     SET     &datumhnd3#  = PREP_PROCESS(&host#,"UNIXCMD","*","CMD=find &in_absolut# -name &inputpattern3#",,"UC_LOGIN=UNIX_UC4")
    :     PROCESS &datumhnd3#
    :     PSET    &result3#   = GET_PROCESS_LINE(&datumhnd3#)
    :     ENDPROCESS
    :     PRINT   'Ergebnis3:&result3#'
    :     CLOSE_PROCESS &datumhnd3#
    :     IF &result3# <> ''
    :       SET &result# = 'Y'
    :     ENDIF
    :   ENDIF
    : ENDIF

    : IF &result# = 'Y'
    :   SET &OBJECTTOSTART# = 'JOBP.CLNG#BSL@DOWNLOAD'
    :   INCLUDE JOBI.UC4#BASIS@START_IF_NOT_RUNNING
    :   PRINT 'Objekt wird gestartet.'
    : ELSE
    :   PRINT 'Objekt wird nicht gestartet.'
    : ENDIF

    Und eben stelle ich fest, dass der "ls xxx | wc -l" eigentlich sogar funktionieren müsste:

    [uc4@uc4-1.integ /tmp]$ ls 1 2 3 | wc -l
    ls: 1: Datei oder Verzeichnis nicht gefunden
    ls: 2: Datei oder Verzeichnis nicht gefunden
    ls: 3: Datei oder Verzeichnis nicht gefunden
    0
    [uc4@uc4-1.integ /tmp]$ echo $?
    0
    [uc4@uc4-1.integ /tmp]$

    Ich hatte seinerzeit zum Test nur mit dem ls probiert. In pipe mit dem wc muss das funktionieren, weil Fehlercodes über eine pipe nicht transportiert werden und der wc geht ja immer gut. Ausnahme bash-option pipefail. Wieder was dazugelernt. Tja, man muss nur miteinander reden :)

    Sollte dann so funktionieren:

    :PSET &result# = 'N'

    :SET &datumhnd# = PREP_PROCESS(&host#,"UNIXCMD","*","CMD=ls &in_absolut#&inputpattern# | wc -l",,"UC_LOGIN=UNIX_UC4")
    :PROCESS &datumhnd#
    :PSET    &result#     = GET_PROCESS_LINE(&datumhnd#)
    :ENDPROCESS
    :PRINT   'Ergebnis:&result#'
    :CLOSE_PROCESS &datumhnd#

    :IF &result# = 3
    :  SET &OBJECTTOSTART# = 'JOBP.CLNG#BSL@DOWNLOAD'
    :  INCLUDE JOBI.UC4#BASIS@START_IF_NOT_RUNNING
    :  PRINT 'Objekt wird gestartet.'
    :ELSE
    :  PRINT 'Objekt wird nicht gestartet.'
    :ENDIF

    Ich probier das in Kürze mal auf dem System aus und bestätige das dann nochmal.

    Vielen Dank Christian, mit Deiner Frage hast Du mir nochmal eine sehr gute Denkanregung gegeben. Kommst Du eigentlich zum Stammtisch in München? Soll angeblich am 15.9. stattfinden. Ein Betriebskollege will da gerne hin und ich bin eh ein alter Münchner...

    Viele Grüße
    Manfred

  • Christian BoeckChristian Boeck Senior Manager Application Process Automation / IT Infrastructure Services MuenchenPosts: 31 Journeyman ✭✭✭
    Hi Manfred,
    ich verusche immer alles mit Automic JCL zu lösen, das ganze müsstest Du auch ganz einfach so hinbekommen.

    :set &count# = "0"
    :set &loop# = PREP_PROCESS_FILENAME("&$AGENT#","/verzeichnis/filename&$PHYS_DATE_YYYYMMDD#.endung","N","N","EVENTUELL_GLEICH_FILTER",,,"UC_LOGIN=&$LOGIN#")

    :process &loop#
    :  set &check# = GET_PROCESS_LINE(&loop#)
    :  set &count# = &count# +1
    :endprocess
    :close_process &loop#

    !dann dein if
    :if &count# = "3"
    :  ......
    :endif

    Dann sparst Du dir Dein unixcmd, aber ich glaube das ist Geschmackssache.

    Stammtisch, yep habe ich auch schon gehört, dass wieder einer sein soll. Ich bin da wenn er ist, dann sehen wir uns.

    Schönen Tag
    Christian
  • Manfred MauermannManfred Mauermann NürnbergPosts: 93 Explorer ✭✭
    Hi Christian,
    den PREP_PROCESS_FILENAME habe ich zwar mal kurz gestreift, bin aber als klassischer Unix-Skripter dann doch beim normalen PREP_PROCESS hängen geblieben. Dein Beispiel ist aber schön übersichtlich und ich werde es bei nächster Gelegenheit nutzen, es erscheint mir tatsächlich als die elegantere Lösung. Vielen Dank dafür.

    Der Termin 15.9. für den Stammtisch ist wohl bestätigt, nur die Örtlichkeit steht noch nicht fest.

    Wünsche auch einen schönen Tag
    Manfred
  • Christian BoeckChristian Boeck Senior Manager Application Process Automation / IT Infrastructure Services MuenchenPosts: 31 Journeyman ✭✭✭
    Hi Manfred,
    ja teste es einfach mal, dann lass uns nochmal sehen ob es was bringt.

    Lacation ist wohl "Wirtshaus zum Osterwaldgarten Keferstraße 12 80802 München"
    Ich bin schon angemeldet :-)

    Schönen Tag
    Christian

  • Manfred MauermannManfred Mauermann NürnbergPosts: 93 Explorer ✭✭
    Hi Christian,

    die Location ist bestätigt, Danke für die Info. Wir sind auch schon alle angemeldet.

    Tja, und eben wollte ich mal den PREP_PROCESS_FILENAME auf einem anderen System bei uns antesten und bin dabei sogleich auf einen Showstopper gestossen.
    Die zu prüfende Datei befindet sich hier auf einem Netzlaufwerk, welches wir immer zum Start verbinden und am Ende wieder trennen müssen. Da macht dann ein separates Skript auf dem Agent/Host wieder Sinn. Es lebe die Vielfalt :smile:

    Viele Grüße
    Manfred
  • Christian BoeckChristian Boeck Senior Manager Application Process Automation / IT Infrastructure Services MuenchenPosts: 31 Journeyman ✭✭✭
    Hi Manfred,
    was mir dazu noch einfällt. Für solchne Fälle nutze ich einen "zentralen" Windows -Agent auf dem wir derartige Sachen ausführen. Quasi ein Zentraler Knotenpunkt in die Windowswelt. D. h. alles was richtung Windows gehen soll läuft über diesen Server bzw. Agent. Dort kann ich ohne Probleme dann Laufwerke mounten, Skript ausführen, unmounten und alles wieder verlassen. Die meisten Sachen löse ich von dort aber gleich über NFS/NFC Freigaben (hoffe das passt so, bin kein Windows'ler) so dass ich die Verzeichnisse immer direkt (\\share\laufwerk\ordner\.....) ansprechen kann.
    Vielleicht hilft Dir das noch ein wenig.
    Schönen Abend
    Christian
  • Manfred MauermannManfred Mauermann NürnbergPosts: 93 Explorer ✭✭
    Hi Christian,
    Danke für den Tip, so ähnlich haben wir das auch bei unserer "eigenen" UC4-Installation, wobei wir da auch nur ein System haben, was unter Win läuft. Bei einem weiteren Provider läuft alles unter Win und hier sind wir an die Provider-Policies gebunden, da krieg ich das leider nicht anders gebacken. Aber es passt ja soweit, wenn auch ein klein wenig umständlicher. Aus Win halte ich mich auch immer gerne raus, wenngleich ich bei dem Projekt nun das erste Mal DOS-CMD nutzen "durfte" :/ Aber dank Google und schon ein paar Tagen Skripterfahrung ging das erstaunlich gut und ich hab alles schön in Includes verpackt, sodass die Jobs recht übersichtlich sind.
    Noch schöne Grüße aus Nürnberg, ich mach mich heut Abend auf den Weg nach München, eine Woche Urlaub daheim. Umstellung vermutlich nicht nötig, hier regnets gerade...
    Manfred
  • Wolfgang BruecklerWolfgang Brueckler Developer LV3 EXAutomicPosts: 1,261 Innovator ✭✭✭✭✭✭
    @Manfred Mauermann
    @Christian Böck

    Wir hatten diese Woche genau das gleiche Problem - hier dürfte der Fehler in der EVENT.UNIXCMD im Mand 0 liegen.

    wenn das OS kommando RC > 0 liefert, wird das Eventfile (meiner Meinung nach fälschlicherweise) gelöscht

    => siehe hier
    https://community.automic.com/discussion/8844/prep-process-ends-up-in-a-no-such-file-or-directory-error-if-the-os-command-returns-rc-0-in-ux#latest

    Wolfgang Brückler
    Developer Lv. 3
    AE 11.2/ORA11G/Linux
  • Manfred MauermannManfred Mauermann NürnbergPosts: 93 Explorer ✭✭
    @Wolfgang Brueckler : Ja, das beschreibt so ziemlich genau unsere Erfahrung bei dem Thema. Ich finde das auch mehr als "unglücklich", das im Fehlerfall das Eventfile gelöscht wird. Das ist ja dann auch der Grund, warum die Kiste abschmiert. Gut, könnte man ändern, eine vernünftige Standardlösung wäre natürlich wünschenswerter.
Sign In or Register to comment.