Timeout Grenze für "ls -l" setzen

J

janni80

Grünschnabel
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
 
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.
 
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?
 
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
 
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
 
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.
 
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
 
Hast du es probiert?

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

Aber wozu den kill prozess killen?
 
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
 
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
 

Ähnliche Themen

Problem mit HSPA+ Modem Huawei E353 - Installation unmöglich?

Fehlendes Modul für Befehl "Order"

[openSuse10.2] SATA mal wieder...

OpenVPN Zertifikate

Zurück
Oben