2010-02-02 5 views
1

Je ne suis pas un expert de script et je me demandais ce qui était une façon acceptable d'exécuter un script pour la plupart x millisecondes (et terminer encore avant x millisecondes si le script est fait avant que le délai d'attente).Un script shell Un * x: quelle est la manière correcte d'exécuter un script pendant au plus x millisecondes?

Je résolu ce problème en utilisant Bash d'une manière que je pense est très hacky et je me demande s'il y a une meilleure façon de le faire.

Fondamentalement, j'ai un script shell appelé sleep_kill.sh qui prend un PID comme premier argument et un délai d'attente comme second argument et qui fait cela:

sleep $2 
kill -9 $1 2> /dev/null 1> /dev/null 

Donc, si le PID correspond à un script finit avant de s'éteindre, rien ne va être tué (je suppose que le système d'exploitation n'aura pas le temps de réutiliser ce PID pour un autre processus [non apparenté] vu qu'il fait défiler tous les ID de processus avant de commencer à les réutiliser).

Quoi qu'il en soit, j'appeler mon script qui peut « suspendre » ou délai d'attente:

command_that_may_hang.sh 
PID=$! 
sleep_kill.sh $PID .3 
wait $PID > /dev/null 2>&1 

Et je vais attendre au plus 300 ms pour command_that_may_hang.sh. Pourtant, si command_that_may_hang.sh a pris seulement 10 ms pour s'exécuter, je ne serai pas "bloqué" pendant 300 ms.

Ce serait génial si un expert en coquille pourrait expliquer les inconvénients de cette approche et ce qu'il faut faire à la place.

+2

Voir http://stackoverflow.com/questions/526782/how-do-i-limit-the-running-time-of-a-bash-script – kennytm

+0

Si vous êtes vraiment déterminé à utiliser un délai d'attente inférieur à 1 seconde, vous voudrez envisager d'utiliser une application de pilote spécial. Même si vous aviez un sleepMilli, la programmation au niveau du shell peut rendre impossible un délai de 300 ms. – gary

Répondre

2

Jetez un oeil à ce script: http://www.pixelbeat.org/scripts/timeout Remarque les délais d'attente de moins d'un seconde sont à peu près aucun sens sur la plupart des systèmes en raison de retards de planification, etc. Note également que les nouveaux coreutils a la commande de délai d'attente inclus et il a une résolution de 1 seconde.

+0

+1, merci beaucoup pour votre script mais ... Pouvez-vous clarifier pourquoi un timeout de moins d'une seconde (!?) Est absurde? J'utilise "sleep .1" tout le temps avec mon hack et ça répond définitivement à près de 1/10ème de seconde: j'ai fait des tests d'impression de dates en nanos (et de toute façon je vois clairement une différence entre un "sleep 1 "et un" sommeil .1 "). Comment la lecture vidéo/les lecteurs de son peuvent-ils fonctionner sur Linux si la planification n'a pas une meilleure granularité qu'une seconde! Cela semble si étrange dans ce jour et l'âge des minuteries de haute précision et des trucs et astuces!? (Je suis confus) – SyntaxT3rr0r

+1

Habituellement, c'est bien, mais parfois il y aura un délai et vous expirer la commande par erreur. De l'expérience dans l'écriture des tests de Coreutils fonctionnant sur divers systèmes à haute puissance mais occupés, un délai de 3 secondes est le minimum trouvé pour ne pas déclencher des délais d'attente erronés. – pixelbeat

Questions connexes