Bash Run Befehl für eine bestimmte Zeit?

12

Ich mache ein Bash-Skript für meinen Gebrauch. Wie kann ich einen Befehl für eine bestimmte Zeit ausführen, z. B. 20 Sekunden, und den Befehl beenden? Ich habe viele Lösungen ausprobiert, aber nichts funktioniert. Ich habe auch den Timeout-Befehl ohne Erfolg ausprobiert. Bitte geben Sie mir eine Lösung dafür.

Beispiel: Ich möchte diesen Befehl nach 10 Sekunden in Skript und Terminal ausführen

some command
Umair Riaz
quelle

Antworten:

14

Hm, das sollte den Trick machen:

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

xmessagebietet hier einen schnellen Testfall (in Ihrem Fall sollte der Airodump-Befehl dorthin gehen); &stellt es in den Hintergrund.

$!enthält die PID des zuletzt gestarteten Prozesses (siehe z. B. /programming//a/1822042/2037712 ); Die PID wird in der Variablen gespeichert pidsave.

sleepSenden Sie nach einiger Wartezeit ( ) ein TERMSignal an den Prozess.

mpy
quelle
Danke Kumpel es funktioniert aber jetzt habe ich 1 Problem. Ich möchte eine Ausgabe sehen, die mit einem Befehl erstellt wird, aber in xmessage-Fenstern wird nichts angezeigt.
Umair Riaz
@UmairRiaz: xmessage war nur ein Beispiel. Um Ihr Beispiel in der Frage anzupassen und die Ausgabe des Befehls zu protokollieren, verwenden Sie some command > logfile &in der ersten Zeile. Anschließend können Sie analysieren logfile.
Mpy
4

An der Bash-Eingabeaufforderung können Sie "

  • your_command & sleep 20; kill $!
  • Oder verwenden Sie den Timeout-Befehl: ZB aptget install timeoutundtimeout -k 3m 14s your_command
  • Oder verwenden Sie expectwie hier beschrieben: /unix/43340/how-to-introduce-timeout-for-shell-scripting
  • oder mach es mit perl: perl -e "alarm 10; exec @ARGV" "Your_command"
  • Oder verwenden Sie diese kryptischere Lösung: $COMMAND 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPID( Quelle und Erklärung )
Hennes
quelle
1

Eine andere Möglichkeit besteht darin, pgrep $ pattern oder pkill $ pattern zu verwenden. Gibt alle PIDs zurück, die dem angegebenen Muster entsprechen, und überprüft alle laufenden Prozesse auf dem Computer. Um den Umfang der PIDs auf diejenigen zu beschränken, die Sie besitzen, verwenden Sie: pgrep -P $ mypid $ pattern oder pkill -P $ mypid $ pattern

Um einen Hintergrundprozess für einen festgelegten Zeitraum auszuführen, sieht Ihr Skript ungefähr so ​​aus:

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

Beachten Sie, dass dadurch alle Prozesse mit demselben Namensmuster beendet werden, die unter der aktuellen übergeordneten PID ausgeführt werden. Auf diese Weise können Sie mehrere Prozesse starten und nach einer bestimmten Zeit alle gleichzeitig beenden.

Paul
quelle