it-swarm-eu.dev

Opakujte příkaz každých x interval v terminálu?

Jak mohu opakovat příkaz v každém časovém intervalu, aby mi umožnil spouštět příkazy pro adresáře kontrola nebo monitorování?

Není třeba skript, potřebuji jen jednoduchý příkaz, který má být proveden v terminálu.

157
user239745

Můžete použít příkaz watch, watch se používá ke spuštění jakéhokoli určeného příkazu v pravidelných intervalech.

Otevřete terminál a zadejte:

watch -n x <your command>

změňte x na čas v sekundách, který chcete.

Další pomoc při používání příkazu watch a jeho možností spusťte man watch nebo navštivte tento Odkaz .

Například: následující seznam, každý 60 s , stejný Terminál, obsah adresáře Desktop, abyste mohli vědět, zda došlo ke změnám:

watch -n 60 ls -l ~/Desktop
231
nux

Tento příkaz můžete použít také v terminálu, kromě odpovědi nux:

while true; do <your_command>; sleep <interval_in_seconds>; done

Příklad

while true; do ls; sleep 2; done

Tento příkaz vytiskne výstup ls v intervalu 2 s.

Použití Ctrl+C zastavit proces.

Existuje několik nevýhod watch

  • Nelze použít žádné aliasy příkazů.
  • Pokud je výstup jakéhokoli příkazu poměrně dlouhý, rolování nefunguje správně.
  • Je nějaký problém nastavit maximální časový interval za určitou hodnotu.
  • watch bude interpretovat ANSI barevné sekvence předávající únikové znaky pomocí -c nebo --color možnost. Například výstup pygmentize bude fungovat, ale pro ls --color=auto.

Za výše uvedených okolností se to může jevit jako lepší možnost.

98
souravc

Jen jsem se chtěl vrhnout k odpovědím souravc a nux:

  1. Zatímco watch bude na Ubuntu perfektně fungovat, můžete se vyhnout tomu, že pokud chcete, aby vaše "Unix-fu" bylo čisté - například na FreeBSD, watch je příkaz "snoop na jiné řádce".
  2. while true; do command; sleep SECONDS; done má také upozornění - váš příkaz může být těžší zabít pomocí CTR + C. Možná budete chtít dát přednost while sleep SECONDS; do command; done - je to nejen kratší, ale také snazší je přerušit. Výzva spočívá v tom, že nejprve spí a poté spustí váš příkaz, takže před prvním výskytem příkazu budete muset počkat několik SECONDS.
37
d33tah

Zní to jako ideální úkol pro démona cron, který umožňuje spouštění periodických příkazů. Spusťte příkaz crontab -e A začněte upravovat konfiguraci cronu uživatele. Jeho formát je dokumentován v crontab (5) . V zásadě máte pět časově závislých polí oddělených mezerami následovaných příkazem:

The time and date fields are:

       field          allowed values
       -----          --------------
       minute         0-59
       hour           0-23
       day of month   1-31
       month          1-12 (or names, see below)
       day of week    0-7 (0 or 7 is Sunday, or use names)

Pokud například chcete spustit skript Python) každé úterý, 11:00:

0 11 * * 1 python ~/yourscript.py

Existují také speciální jména, která čas nahrazují, například @reboot. Velmi užitečné, pokud potřebujete vytvořit dočasný adresář. Z mého crontabu (uvedeny s crontab -l):

# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"
11
Lekensteyn

Pokud sledujete systém souborů, pak je inotifywait skvělý a určitě přidává menší zatížení systému.

Příklad:

V terminálu 1st zadejte tento příkaz:

$ inotifywait .

Pak na terminálu 2nd, jakýkoli příkaz, který ovlivňuje aktuální adresář,

$ touch newfile

Poté se v původním terminálu inotifywait probudí a nahlásí událost

./ CREATE newfile2

Nebo ve smyčce

$ while true ; do inotifywait . ; done
Setting up watches.  
Watches established.
./ OPEN newfile2
Setting up watches.  
Watches established.
./ OPEN newfile2
Setting up watches.  
Watches established.
./ DELETE newfile
Setting up watches.  
Watches established.
./ CREATE,ISDIR newdir
Setting up watches.  
Watches established.
5
X Tian

můžete použít crontab. spusťte příkaz crontab -e a otevřete jej pomocí upřednostňovaného textového editoru a poté přidejte tento řádek

*/10 * * * *  /path-to-your-command

Tímto příkazem se spustí každých 10 minut

* */4 * * *  /path-to-your-command

Tímto příkazem se spustí každé 4 hodiny

Další možné řešení

$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done

X kolikrát se má opakovat.

Y čas čekat na opakování.

Příklad:

$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done
4
Maythux

Můžete si vytvořit svůj vlastní příkaz repeat pomocí následujících kroků; kredity zde :

Nejprve otevřete soubor .bash_aliases:

$ xdg-open ~/.bash-aliases

Za druhé, vložte tyto řádky do dolní části souboru a uložte:

repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
    "[email protected]"
done
}

Za třetí, zavřete a znovu otevřete terminál nebo zadejte:

$ source ~/.bash_aliases

Et voilà! Nyní ji můžete použít takto:

$ repeat 5 echo Hello World !!!

nebo

$ repeat 5 ./myscript.sh
4
Blufter

Dalším problémem výše popsaného přístupu „hodinky“ je to, že zobrazuje výsledek pouze po dokončení procesu. "date; sleep 58; date" zobrazí 2 data pouze po 59 sekundách ... Pokud spustíte něco, co běží po dobu 4 minut, které zobrazují pomalu více stránek obsahu, nebudete jej skutečně vidět.

Na druhé straně, obavami z přístupu „while“ je to, že nezohledňuje trvání úkolu.

while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done

Díky tomu bude skript spuštěn někdy každou minutu, někdy může trvat 1m40. Takže i když to cron bude schopen spustit každou minutu, tady to nebude.

Chcete-li vidět výstup na Shell, jak je generován, a čekat na přesný čas žádosti, musíte se podívat na čas před a po, a smyčku s chvíli.

Něco jako:

while ( true ); do
  echo Date starting `date`
  before=`date +%s`
  sleep `echo $(( ( RANDOM % 30 )  + 1 ))`
  echo Before waiting `date`
  after=`date +%s`
  DELAY=`echo "60-($after-$before)" | bc`
  sleep $DELAY
  echo Done waiting `date`
done

Výsledkem bude:

Jak vidíte, příkaz se spustí každou minutu:

Date starting Mon Dec 14 15:49:34 EST 2015
Before waiting Mon Dec 14 15:49:52 EST 2015
Done waiting Mon Dec 14 15:50:34 EST 2015

Date starting Mon Dec 14 15:50:34 EST 2015
Before waiting Mon Dec 14 15:50:39 EST 2015
Done waiting Mon Dec 14 15:51:34 EST 2015

Stačí tedy nahradit příkaz "sleep echo $(( ( RANDOM % 30 ) + 1 ))" tím, co chcete a co bude spuštěno na terminálu/shellu přesně každou minutu. Pokud chcete jiný rozvrh, jednoduše změňte „60“ sekund s tím, co potřebujete.

Kratší verze bez ladících řádků:

while ( true ); do
  before=`date +%s`
  sleep `echo $(( ( RANDOM % 30 )  + 1 ))` # Place you command here
  after=`date +%s`
  DELAY=`echo "60-($after-$before)" | bc`
  sleep $DELAY
done
3
jmspaggi