[UNIX] programma uitvoeren met timeout

Pagina: 1
Acties:

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 16:51
Weet iemand of het mogelijk is een script, (bijvoorbeeld een bash script) een timeout waarde mee te geven, met het volgende effect?

voer een commando uit. Geef het resultaat terug van het commando, als deze binnen de timeout tijd klaar is. Zo niet, geef nadat de timeout tijd verlopen is een foutmelding terug.


Ik roep namelijk vanuit php m.b.v. exec() imagemagick programma's aan. Deze commando's geven een output waarde die ik nodig heb in PHP. Ik vermoed echter soms het script blijft hangen, waardoor mijn apache thread vast komt te zitten. Het programma in de achtergrond draaien met 'bash - c exec nohup commando' is geen optie, omdat ik dan ook de output niet meer terug krijg.

Ik blijf er iig vrij nuchter onder....


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

je kunt met bash - c exec nohup toch even naar een bestandje pipen? ;)
de output dan... heb je je output weer terug ...

Zaram module kopen voor je glasvezelaansluiting?


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 16:51
En hoe weet php dan wanneer dat bestandje de output bevat?

Soms is het programma heel snel, soms heel traag. Als ik dus een sleep() in php zet, dan wordt het script veel te traag.

Ik blijf er iig vrij nuchter onder....


  • BoAC
  • Registratie: Februari 2003
  • Laatst online: 21:40

BoAC

Memento mori

Hier een bash voorbeeldje voor bijv ntpdate:
code:
1
2
3
4
        ${NTPCLIENT_CMD} ${NTPCLIENT_OPTS} >/dev/null &
        local pid=$!
        (sleep ${NTPCLIENT_TIMEOUT:-30}; kill -9 ${pid} >&/dev/null) &
        wait ${pid}
:P

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 16:51
Op die manier wacht je altijd een vast aantal seconden voordat je het script stopt.

Stel nu dat het ntpdate programmaatje in 1 ms klaar is, en je timeout staat op 5 seconden, dan moet je dus altijd 5 seconden wachten totdat het script afgelopen is.

Wat ik wil is dat als het commando in de achtergrond klaar is, dat het bash script stop, en als dat langer dan de timeout duurt dat het script dan ook stop.

Ik blijf er iig vrij nuchter onder....


  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

je maakt een bestandje aan met touch in /tmp nadat het commando klaar is:

commando && touch /tmp/a
en dan met een if [ -e /tmp/a ] blijven checken?


gewoon dat bestandje als flag gebruiken ;) en daarna wegtiefen.

Zaram module kopen voor je glasvezelaansluiting?


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 16:51
Hmm ok, dat is een oplossing, maar niet voor mij.

Dit script wordt vanuit een php script aangeroepen, miljoenen keren per dag. Ik wil sowieso niet zoveel flagfiles maken.

Ik blijf er iig vrij nuchter onder....


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 16:51
Ah, hiermee kan het wel!

code:
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

pid=$$

(sleep 5; kill -9 ${pid} >&/dev/null) &

sleeppid=$!

/home/tibaco/loop.sh

kill -9 ${sleeppid} > /dev/null 2>&1 &

Ik blijf er iig vrij nuchter onder....


  • Ivo
  • Registratie: Juni 2001
  • Laatst online: 14-01-2025

Ivo

Boudewijn schreef op woensdag 14 juni 2006 @ 20:02:
je maakt een bestandje aan met touch in /tmp nadat het commando klaar is:

commando && touch /tmp/a
en dan met een if [ -e /tmp/a ] blijven checken?


gewoon dat bestandje als flag gebruiken ;) en daarna wegtiefen.
Waarom een bestand aanmaken als je ook gewoon variabelen kunt gebruiken?
code:
1
2
3
4
5
a=0 && commando && a=1 &
while true
do if $a = 1 then break
done
echo Done

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 16:51
een while loop is niet de juiste manier om een programma te laten slapen, daarvoor is wait() en sleep() bedacht. Met een while loop maak je onnodig veel computaties.

Ik blijf er iig vrij nuchter onder....

Pagina: 1