Il seguente script mostra come eseguire questa operazione utilizzando le attività in background. La prima sezione uccide un processo di 60 secondi dopo il limite di 10 secondi. Il secondo tenta di uccidere un processo già uscito. Tieni presente che, se imposti il tuo timeout molto alto, gli ID di processo potrebbero capitare e uccidere il processo sbagliato, ma questo è più di un problema teorico - il timeout dovrebbe essere molto grande e tu avresti per iniziare un lotto di processi.
#!/usr/bin/bash
sleep 60 &
pid=$!
sleep 10
kill -9 $pid
sleep 3 &
pid=$!
sleep 10
kill -9 $pid
ecco l'output sulla mia casella di Cygwin:
$ ./limit10
./limit10: line 9: 4492 Killed sleep 60
./limit10: line 11: kill: (4560) - No such process
Se si vuole solo aspettare fino a quando il processo è finito, è necessario inserire un ciclo e verificare. Questo è leggermente meno preciso dal sleep 1
e gli altri comandi in realtà impiegano più di un secondo (ma non molto di più). Utilizzare questo script per sostituire la seconda sezione sopra (i comandi "echo $proc
" e "date
" sono per il debug, non mi aspetto di averli nella soluzione finale).
#!/usr/bin/bash
date
sleep 3 &
pid=$!
((lim = 10))
while [[ $lim -gt 0 ]] ; do
sleep 1
proc=$(ps -ef | awk -v pid=$pid '$2==pid{print}{}')
echo $proc
((lim = lim - 1))
if [[ -z "$proc" ]] ; then
((lim = -9))
fi
done
date
if [[ $lim -gt -9 ]] ; then
kill -9 $pid
fi
date
Fondamentalmente esegue il ciclo, controllando se il processo è ancora in esecuzione ogni secondo. Altrimenti, esce dal ciclo con un valore speciale per non tentare e uccidere il bambino. Altrimenti scade e uccide il bambino.
ecco l'output per un 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
e un 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, guarda la mia risposta aggiornata su come smettere di aspettare al più presto o f timeout e child-exit-normalmente. – paxdiablo
Domanda simile, alcune risposte diverse: http://stackoverflow.com/questions/687948 –