GNU/Linux >> Znalost Linux >  >> Linux

Jaký je jednoduchý způsob, jak nechat příkaz běžet 5 minut?

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í procesu

SYNOPSE

timelimit [-pq] [-S killsig] [-s warnsig] [-T killtime] [-t warntime] command [arguments ...]

a

NAME

timeout - spustit příkaz s časovým limitem

SYNOPSE

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:

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

Linux
  1. Jaký je ekvivalent linuxového příkazu updatedb pro Mac?

  2. Co je ekvivalentní příkazu Linux File pro Windows?

  3. K čemu je Linux test – příkazový test?

  1. Co definuje maximální velikost pro jeden příkazový argument?

  2. CronJob každých 25 minut

  3. Co tvoří „pole“ pro příkaz cut?

  1. Co se stane, když spustím příkaz Cat /proc/cpuinfo?

  2. Jednoduchý způsob, jak převést HH:MM:SS (hodiny:minuty:sekundy.rozdělené sekundy) na sekundy

  3. Co znamená 'cd -'?