Timeout Grenze für "ls -l" setzen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von janni80, 11.02.2008.

  1. #1 janni80, 11.02.2008
    janni80

    janni80 Grünschnabel

    Dabei seit:
    11.02.2008
    Beiträge:
    5
    Zustimmungen:
    0
    Hallo zusammen,

    ich habe folgendes Problem. Ich will in folgendem Shell-Script eine Timeout-Grenze für den ls-Befehl definieren.

    while read DELISYST
    do
    cd ${PMRootDir}"/import/"${DELISYST}
    # Suche alle OK-Files der Tranche 01
    ls -ltr *01.ok 2> /dev/null |
    while read F1 F2 F3 F4 F5 MON DAY TIME SRC_FILENAME_ORG_OK
    do
    # Suche nach zugehòrigem Dateinamen (ohne .ok)
    SRC_FILENAME_ORG=`echo ${SRC_FILENAME_ORG_OK} | nawk '{POS=index($0, ".ok"); \
    if (POS>0) print substr($0, 1, POS-1 )}'`​

    Wie kann ich nun einen Timeout bei dem "ls -ltr"-Befehl setzen, der z.B. nach 30s abbricht?
    Ich hoffe jmd. kann mir helfen.

    Grüsse
    Janni
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. tr0nix

    tr0nix der-mit-dem-tux-tanzt

    Dabei seit:
    11.07.2003
    Beiträge:
    1.585
    Zustimmungen:
    0
    Ort:
    Schweiz, Opfikon/Glattbrugg
    Was eine Lösung sein könnte ist ggf. mit find. Ich denke da gibt es eine Option, wieviele Resultate er ausgeben soll. Timeouts sind mir jedoch bei solchen Programmen nie begegnet.. da müsstest du was simulieren und nach einer bestimmten Zeit den Prozess killen.
     
  4. #3 janni80, 11.02.2008
    janni80

    janni80 Grünschnabel

    Dabei seit:
    11.02.2008
    Beiträge:
    5
    Zustimmungen:
    0
    Hallo,
    es geht ja nicht um die Resultate, sondern das der ls-Befehl für etwa 60s laufen soll, da von den Liefersystemen Daten kommen, diese sollen jedoch nur für ein bestimmtes Zeitintervall laufen (60s) und dann gestoppt werden.
    Was kann man da machen?
     
  5. #4 Wolfgang, 11.02.2008
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Du kannst ls nicht selbst sagen, wann es sich beenden soll.
    Das wird über den Kernel gesteuert.
    Maximal über ulimit -t kannst du einschränken, was aber keine wirkliche Lösung ist.
    Das betrifft dann nämlich alle Prozesse dieses Users.

    Also musst du sowas über kill basteln.
    Dazu aber vorher den prozess in den Hintergrund schicken, sonst läuft der Code nicht weiter.

    Gruß Wolfgang
     
  6. #5 janni80, 11.02.2008
    janni80

    janni80 Grünschnabel

    Dabei seit:
    11.02.2008
    Beiträge:
    5
    Zustimmungen:
    0
    Hallo Wolfgang,

    würde es dann in etwa so ausschauen:

    while read DELISYST
    do
    cd ${PMRootDir}"/import/"${DELISYST}
    # Suche alle OK-Files der Tranche 01
    timeout=60 #in seconds
    ls -ltr *01.ok 2> /dev/null |(sleep $timeout; kill -9 $cmdpid)|

    while read F1 F2 F3 F4 F5 MON DAY TIME SRC_FILENAME_ORG_OK
    do
    # Suche nach zugehòrigem Dateinamen (ohne .ok)
    SRC_FILENAME_ORG=`echo ${SRC_FILENAME_ORG_OK} | nawk '{POS=index($0, ".ok"); \
    if (POS>0) print substr($0, 1, POS-1 )}'`​

    Wenn das falsch sein sollte, kannst du mir bitte sagen, wie ich es anpassen müsste?

    Grüsse
    Janni
     
  7. #6 Hans Dampf, 11.02.2008
    Hans Dampf

    Hans Dampf Jungspund

    Dabei seit:
    19.01.2008
    Beiträge:
    20
    Zustimmungen:
    0
    Das Problem ist u.a., an die richtigen PID's zu kommen. Das hier klappt in einem ähnlichen Fall
    Code:
    #!/bin/bash
    
    my_function()
    {
        #Das hier ist eine Handlung, die laenger dauern koennte.
        find / -print | while read datei; do
    	echo $datei >/dev/null 2>/dev/null
        done
    }
    
    #Funktion aufrufen und 1s im Hintergrund laufen lassen
    my_function &
    background_pid=$!
    sleep 1s
    
    # Wir koennen nun ueber die beim Aufruf von 'my_function' gestarteten
    # Hintergrundsprozesse iterieren, um diese zu beenden. Hierbei wurde
    # auch eine neue Subshell gestartet; diese soll nicht gewaltsam beendet
    # werden; sie beendet sich von selbst, wenn alle ihre Kindsprozesse
    # beendet wurden.
    me=$(basename $0) #Der Name der Subshell
    ps --ppid $background_pid -o pid,cmd --no-header | while read ps_record; do
        #Alle Hintergrundprozesse ausser der Subshell 'killen'.
        $(echo $ps_record $me | awk '$(NF-1) !~ $NF {print "kill -s KILL " $1}')
    done
    
    Das ps habe ich bisher aber nur unter Linux getestet.
     
  8. #7 janni80, 12.02.2008
    janni80

    janni80 Grünschnabel

    Dabei seit:
    11.02.2008
    Beiträge:
    5
    Zustimmungen:
    0
    Hallo zusammen,

    kann das so richtig sein, hab folgendes abgeändert:

    # Berechne Zahl der Records aus der Gròesse der Datei
    (ls -lL ${SRC_FILENAME_ORG} | read F1 F2 F3 F4 SIZE REST 2> /dev/null) & cmdpid=$!
    # Starte "watchdog"-Prozess, um Kommando nach 10s zu terminieren
    (sleep 10; kill -9 -$cmdpid) & watchdogpid=$!
    # Warte auf Kommando
    wait $cmdpid
    kill $watchdogpid >/dev/null 2>&1​

    Stören sich die cmdpid und die watchdogpid nicht gegenseitig und würde das Script so laufen oder wäre man in einer Endlosschleife?

    Ich wäre über Feedback sehr dankbar.

    Grüsse
    Janni
     
  9. #8 Wolfgang, 12.02.2008
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hast du es probiert?

    Ich würde aber zur Sicherheit die ID mit ps aux filtern.

    Aber wozu den kill prozess killen?
     
  10. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  11. #9 janni80, 12.02.2008
    janni80

    janni80 Grünschnabel

    Dabei seit:
    11.02.2008
    Beiträge:
    5
    Zustimmungen:
    0
    Hallo Wolfgang,

    wie sollte denn deiner Meinung nach der Code aussehen, damit der kill-Prozess nicht gekillt wird. Entschuldige die Frage, aber ich bin in Shell-Scripting nicht fit, und brauche Hilfe. Hintergrund ist, dass das Script in unregelmässigen Abständen hängt, wenn der ls-Befehl ausgeführt wird. Darum hat mein Chef mich gebeten, um den ls-Befehl ein Timeout zu setzen, der den Prozess nach einer gewissen Zeit killt.
    Wie meinst du denn, müsste der Code aussehen, damit er funktioniert?

    Vielen Dank schonmal im Voraus.

    Grüsse
    Janni
     
  12. #10 Wolfgang, 12.02.2008
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Hier mal ein ganz simples Beispiel, ohne test ob der Prozess noch läuft:
    Code:
    (for a in {1..1000000}; do echo $a;done 1>/dev/null)& I=${!};sleep 2;echo kill $I
    
    Kein wait und kein Kill Kill.

    Gruß Wolfgang
     
Thema:

Timeout Grenze für "ls -l" setzen

Die Seite wird geladen...

Timeout Grenze für "ls -l" setzen - Ähnliche Themen

  1. Timeout für Long Time Querys

    Timeout für Long Time Querys: Hi, ich habe ein kleines Script für Cronjob Aufrufe. Nun ist das Problem das ich die Einstellungen von SQL und PHP so setzen (musste) das die...
  2. "send: Cannot determine peer address" nach Timeout mit UDP Server -Perl Socket eval{}

    "send: Cannot determine peer address" nach Timeout mit UDP Server -Perl Socket eval{}: Mahlzeit, ich habe ein kleines Problem und würde mich über eure Mithilfe freuen! Folgender UDP-Server soll nach einem Timeout über eval{}...
  3. Login (10sec timeout) SSH

    Login (10sec timeout) SSH: Hallo, ich habe eine CentOS 5.5 Root-Server den ich per SSH verwalte. Nun habe ich folgendes Problem: Wenn ich mich mit den Server per SSH...
  4. IP Timeouts, VPN Timeouts, reordering timeout erhöhen

    IP Timeouts, VPN Timeouts, reordering timeout erhöhen: Hallo. Wie kann ich unter Linux die Timeouts für IP, und für PPTP Verbindungen ( reordering timeout ) erhöhen? Ich habe mit der UMTS...
  5. TimeOut

    TimeOut: Hallo, bin es mal wieder mit einer neuen frage: Nun habe ich meinen apache soweit, das alles über ssl läuft. Nun meine frage: Wie kann...