Bash Esegui il comando per un certo tempo?


12

Sto realizzando script bash per il mio uso. Come posso eseguire un comando per un certo periodo, ad esempio 20 secondi e terminare il comando? Ho provato molte soluzioni ma nulla funziona, ho anche provato il comando di timeout senza successo. Per favore, dammi una soluzione per questo.

per esempio: voglio eseguire questo comando nello script e nel terminale dopo 10 sec

some command

Risposte:


14

Hm, questo dovrebbe fare il trucco:

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

xmessagefornisce un rapido test case qui (nel tuo caso il comando airodump dovrebbe andare lì); &lo mette in secondo piano.

$!contiene il PID dell'ultimo processo avviato (vedere ad esempio /programming//a/1822042/2037712 ); il PID viene salvato nella variabile pidsave.

Dopo qualche attesa ( sleep), invia un TERMsegnale al processo.


Grazie amico funziona ma ora ho 1 problema. Voglio vedere l'output creato dal comando ma le finestre di xmessage non mostrano nulla.
Umair Riaz,

@UmairRiaz: xmessage era solo un esempio. Per adattare il tuo esempio alla domanda e registrare l'output del comando utilizzare some command > logfile &nella prima riga. Successivamente puoi analizzare logfile.
mpy

4

Dal prompt di bash puoi usare "

  • your_command & sleep 20; kill $!
  • Oppure usa il comando timeout: eg aptget install timeoutetimeout -k 3m 14s your_command
  • Oppure usa expectcome spiegato qui: /unix/43340/how-to-introduce-timeout-for-shell-scripting
  • o fallo con perl: perl -e "alarm 10; exec @ARGV" "Your_command"
  • O usa questa soluzione più criptica: $COMMAND 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPID( Fonte e spiegazione )

1

Un altro modo è usare pgrep $ pattern o pkill $ pattern; restituisce tutti i PID corrispondenti al modello specificato, esaminando tutti i processi in esecuzione sulla macchina. Quindi, per limitare l'ambito dei PID solo a quelli che possiedi, usa: pgrep -P $ mypid $ pattern o pkill -P $ mypid $ pattern

Quindi, per eseguire un processo in background per un determinato periodo di tempo, il tuo script sarebbe simile a questo:

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

Tieni presente che ciò ucciderà tutti i processi con lo stesso modello di nome in esecuzione nel PID padre corrente. Quindi potresti usarlo per avviare più processi e ucciderli tutti contemporaneamente dopo un certo tempo.


0

È possibile utilizzare una sveglia da riga di comando come ebay-alarm

Installa lo script della sveglia e fai

ebay-alarm 10 sec -c some command &

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.