Ve skutečnosti je to timeout je pro:
TIMEOUT(1) User Commands TIMEOUT(1)
NAME
timeout - run a command with a time limit
SYNOPSIS
timeout [OPTION] DURATION COMMAND [ARG]...
timeout [OPTION]
DESCRIPTION
Start COMMAND, and kill it if still running after DURATION.
[email protected]:~$ dpkg -S /usr/bin/timeout
coreutils: /usr/bin/timeout
Existují (alespoň) dva programy, které tuto funkci poskytují:
NAME
timelimit— účinně omezit absolutní dobu provádění procesuSYNOPSE
timelimit [-pq] [-S killsig] [-s warnsig] [-T killtime] [-t warntime] command [arguments ...]
a
NAME
timeout- spustit příkaz s časovým limitemSYNOPSE
timeout [OPTION] DURATION COMMAND [ARG]...
timeout [OPTION]
Jsou zabaleny následovně:
$ dlocate `which timeout timelimit`
timelimit: /usr/bin/timelimit
coreutils: /usr/bin/timeout
Porovnání:
/-----------------------------+------------+----------------\
| Feature | timelimit | timeout |
+=============================+============+================+
| time to run | -t time | first argument |
+-----------------------------+------------+----------------+
| terminate signal | -s signal | -s signal |
+-----------------------------+------------+----------------+
| grace period | -T time | -k time |
+-----------------------------+------------+----------------+
| kill signal | -S signal | (note 1) |
+-----------------------------+------------+----------------+
| propagate signals | -p | (note 2) |
\-----------------------------+------------+----------------/
Poznámky:
timeoutvždy používáSIGKILLjako jeho signál poslední záchrany.timeoutnemá žádnou funkci pro ukončení se signálem, když tak učiní podřízený program.
Stav ukončení obou programů se liší, ale je těžké to úhledně shrnout, takže vám doporučuji, abyste si to sami prohlédli v manuálových stránkách.
Jako timeout je standardně nainstalován na více systémech (coreutils je standardní balíček v mnoha distribucích), doporučuji jej používat, pokud nepotřebujete další funkce poskytované timelimit .
Čistý bash vestavěný, bez coreutils
Zjistil jsem, že toto řešení funguje v bash spoléhající na vestavěné příkaz bez volání externího spustitelného souboru. Funguje na systému, kde nakonec ani nejsou nainstalovány coreutils
YourCommand & read -t 300 ; kill $! # 1st version
YourCommand & read -t 300 || kill $! # 2nd version
Vysvětlení :jako obvykle, když posíláte příkaz na pozadí s & , jeho PID je uloženo do interní proměnné $! (přítomný v moderní verzi dash , csh , bash , tcsh , zsh ...).
Co skutečně dělá rozdíl mezi shelly, je přítomnost vestavěného příkaz read a volby -t .V 1. verzi, pokud uživatel nedokončí řádek vstupu před zadaným počtem sekund, instrukce bude ukončena a bude vygenerován návratový kód chyby.
Druhá verze funguje jako 1., ale časový limit zabíjení můžete zrušit stisknutím enter .
Ve skutečnosti operátor nebo || provede kill pouze pokud read příkaz skončí s návratovým kódem odlišným od nuly, jako když vyprší časový limit. Pokud stisknete enter před tímto okamžikem vrátí 0 a nezruší váš předchozí příkaz.
Řešení Coreutils
Když coreutils jsou přítomny ve vašem systému a nemusíte šetřit čas a prostředky k volání externího programu timeout a sleep a oba jsou dokonalými způsoby, jak dosáhnout svého cíle.
timeout Použití timeout je přímočarý.
Nakonec můžete zvážit použití také -k možnost poslat další signál zabíjení, pokud první selže.
timeout 5m YourCommand # 3rd version
sleep S sleep můžete použít svou fantazii nebo se inspirovat. Upozorňujeme, že příkaz můžete ponechat na pozadí nebo v popředí (např. top obvykle musí být v popředí).
YourCommand & sleep 5m; kill $! # 4th Background
YourCommand & pid=$! ; (sleep 5m; kill $pid;) & # 5th Background
bash -c '(sleep 5m; kill $$) & exec YourCommand' # 6th Foreground
(cmdpid=$BASHPID; (sleep 5m; kill $cmdpid) & exec YourCommand) # 7th Foreground
Vysvětlení
Samozřejmě v každé verzi můžete poslat požadovaný signál zabití, od výchozího po extrémní kill -9 , který má být použit pouze v případě, že je to skutečně nutné.
Odkazy
- [1] The Coreutils
- [2] The Bash Beginners Guide
- [3] BashFAQ