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:
timeout
vždy používáSIGKILL
jako jeho signál poslední záchrany.timeout
nemá žá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