Commande Bash Run pendant un certain temps?

12

Je fais un script bash pour mon usage. Comment puis-je exécuter une commande pendant un certain temps, comme 20 secondes et terminer la commande? J'ai essayé beaucoup de solutions mais rien ne fonctionne, j'ai aussi essayé la commande timeout sans succès. Veuillez me donner une solution pour cela.

par exemple: je veux exécuter cette commande dans le script et le terminal après 10 secondes

some command
Umair Riaz
la source

Réponses:

14

Hm, ça devrait faire l'affaire:

xmessage "Hello World" &
pidsave=$!
sleep 10; kill $pidsave

xmessagefournit un cas de test rapide ici (dans votre cas, la commande airodump devrait y aller); &met en arrière-plan.

$!contient le PID du dernier processus démarré (voir par exemple /programming//a/1822042/2037712 ); le PID est enregistré dans la variable pidsave.

Après quelques temps d'attente ( sleep), envoyez un TERMsignal au processus.

mpy
la source
Merci mon pote ça marche mais maintenant j'ai 1 problème. Je veux voir la sortie qui est créée par la commande mais les fenêtres xmessage ne montrent rien.
Umair Riaz
@UmairRiaz: xmessage n'était qu'un exemple. Pour adapter votre exemple dans la question et enregistrer la sortie de la commande, utilisez some command > logfile &la première ligne. Ensuite, vous pouvez analyser logfile.
mpy
4

À l'invite bash, vous pouvez utiliser "

  • your_command & sleep 20; kill $!
  • Ou utilisez la commande de temporisation: par exemple, aptget install timeoutettimeout -k 3m 14s your_command
  • Ou utilisez expectcomme expliqué ici: /unix/43340/how-to-introduce-timeout-for-shell-scripting
  • ou faites-le avec perl: perl -e "alarm 10; exec @ARGV" "Your_command"
  • Ou utilisez cette solution plus cryptique: $COMMAND 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPID( Source et explication )
Hennes
la source
1

Une autre façon consiste à utiliser pgrep $ pattern ou pkill $ pattern; renvoie tous les PID correspondant au modèle donné, en parcourant tous les processus en cours d'exécution sur la machine. Donc, pour limiter la portée des PID à ceux que vous possédez, utilisez: pgrep -P $ mypid $ pattern, ou pkill -P $ mypid $ pattern

Donc, pour exécuter un processus d'arrière-plan pendant une durée définie, votre script ressemblerait à ceci:

#!/bin/bash 
mypid=$$
run_something &
sleep $time_in_seconds
pkill -P $mypid something

Gardez à l'esprit que cela va tuer tous les processus avec le même modèle de nom s'exécutant sous le PID parent actuel. Vous pouvez donc l'utiliser pour démarrer plusieurs processus et les tuer tous simultanément après un certain temps.

Paul
la source
0

Vous pouvez utiliser un réveil en ligne de commande comme ebay-alarm

Installez le script de réveil et faites

ebay-alarm 10 sec -c some command &

marinara
la source