Le script suivant montre comment procéder en utilisant des tâches d'arrière-plan. La première section tue un processus de 60 secondes après la limite de 10 secondes. La seconde tente de tuer un processus déjà sorti. Gardez à l'esprit que, si vous définissez votre délai d'attente très élevé, les identifiants de processus risquent de se renverser et vous tiendrez le mauvais processus, mais il s'agit plus d'un problème théorique - le délai devrait être très élevé et vous auriez démarrer un lot des processus.
#!/usr/bin/bash
sleep 60 &
pid=$!
sleep 10
kill -9 $pid
sleep 3 &
pid=$!
sleep 10
kill -9 $pid
est ici la sortie sur ma boîte Cygwin:
$ ./limit10
./limit10: line 9: 4492 Killed sleep 60
./limit10: line 11: kill: (4560) - No such process
Si vous voulez attendre que jusqu'à ce que le processus est terminé, vous devez entrer une boucle et vérifier. Ceci est légèrement moins précis puisque sleep 1
et les autres commandes prendront réellement plus d'une seconde (mais pas beaucoup plus). Utilisez ce script pour remplacer la deuxième section ci-dessus (les commandes "echo $proc
" et "date
" sont pour le débogage, je ne m'attendrais pas à les avoir dans la solution finale). Il boucle fondamentalement, vérifiant si le processus est toujours en cours d'exécution toutes les secondes.
Sinon, il quitte la boucle avec une valeur spéciale pour ne pas essayer de tuer l'enfant. Sinon, il expire et tue l'enfant.
est ici la sortie pour une sleep 3
:
Mon Feb 9 11:10:37 WADT 2009
pax 4268 2476 con 11:10:37 /usr/bin/sleep
pax 4268 2476 con 11:10:37 /usr/bin/sleep
Mon Feb 9 11:10:41 WADT 2009
Mon Feb 9 11:10:41 WADT 2009
et sleep 60
:
Mon Feb 9 11:11:51 WADT 2009
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
pax 4176 2600 con 11:11:51 /usr/bin/sleep
Mon Feb 9 11:12:03 WADT 2009
Mon Feb 9 11:12:03 WADT 2009
./limit10: line 20: 4176 Killed sleep 60
@jm, voir ma réponse mise à jour pour savoir comment arrêter d'attendre au plus tôt o f timeout et child-exit-normalement. – paxdiablo
Question similaire, quelques réponses différentes: http://stackoverflow.com/questions/687948 –