Questa risposta al comando da riga di comando per uccidere automaticamente un comando dopo un certo periodo di tempo
propone un metodo a 1 riga per il timeout di un comando di lunga durata dalla riga di comando bash:
( /path/to/slow command with options ) & sleep 5 ; kill $!
Ma è possibile che un determinato comando "di lunga durata" possa terminare prima del timeout. (Chiamiamolo un comando "tipicamente long-running-ma-talvolta-veloce", o tlrbsf per divertimento.)
Quindi questo elegante approccio da 1 linea ha un paio di problemi. Innanzitutto, sleep
non è condizionale, quindi imposta un limite inferiore indesiderabile sul tempo impiegato per il completamento della sequenza. Considera 30s o 2m o anche 5m per il sonno, quando il comando tlrbsf termina in 2 secondi - altamente indesiderabile. In secondo luogo, ilkill
è incondizionato, quindi questa sequenza tenterà di uccidere un processo non in esecuzione e gemere al riguardo.
Così...
C'è un modo per eseguire il timeout di un comando tipicamente long-running-ma-talvolta-fast ( "tlrbsf" ) che
- ha un'implementazione bash (l'altra domanda ha già risposte Perl e C)
- terminerà alla prima delle due: tlrbsf programma o timeout scaduto
- non ucciderà i processi inesistenti / non in esecuzione (o, facoltativamente: non si lamenterà di una cattiva uccisione)
- non deve essere un 1-liner
- può funzionare con Cygwin o Linux
... e, per i punti bonus, esegue il comando tlrbsf in primo piano e qualsiasi " sospensione " o processo extra in background, in modo che lo stdin / stdout / stderr del comando tlrbsf possa essere reindirizzato, come se fosse stato correre direttamente?
In tal caso, condividi il tuo codice. Altrimenti, spiega perché.
Ho passato un po 'di tempo a cercare di hackerare l'esempio di cui sopra, ma sto colpendo il limite delle mie abilità di bash.
timeout
utilità gnu ?
timeout
è grande! puoi persino usarlo con più comandi (script multilinea): stackoverflow.com/a/61888916/658497