Відповіді:
Ви можете використовувати watch
команду, watch використовується для запуску будь-якої призначеної команди через рівні проміжки часу.
Відкрити термінал і ввести:
watch -n x <your command>
зміни x на час, який потрібно в секундах.
Щоб отримати додаткову допомогу щодо використання watch
команди та її параметрів, запустіть man watch
або відвідайте це Посилання .
Наприклад: нижче буде перераховано кожні 60-ті роки на тому самому Терміналі вміст каталогу Desktop, щоб ви могли знати, чи відбулися якісь зміни:
watch -n 60 ls -l ~/Desktop
watch
команду типу "включена історія"? Я люблю використовувати watch
, але іноді я вважаю за краще бачити журнал попередніх страт, а не лише останній. І так, я знаю, що я можу використовувати сценарій ( while true
), щоб досягти цього, але використання watch
утиліти набагато чистіше!
Ви також можете використовувати цю команду в терміналі, окрім відповіді nux:
while true; do <your_command>; sleep <interval_in_seconds>; done
Приклад
while true; do ls; sleep 2; done
Ця команда буде друкувати вихід з ls
інтервалом у 2 секунди.
Використовуйте Ctrl+, Cщоб зупинити процес.
Недоліків мало watch
watch
буде інтерпретувати послідовність кольорів ANSI, передаючи символи втечі, використовуючи -c
або --color
параметр. Наприклад, вихід pygmentize
буде працювати, але це не вдасться ls --color=auto
.У вищезазначених обставинах це може виявитися кращим варіантом.
watch
існує для цього, я б трохи марно сказав,
watch
добре в більшості випадків. Саме тому я на початку згадував "крім відповіді нукса". Але проблем існує, watch
наприклад, наприклад, з ними не можна використовувати жодних псевдонімових командwatch
. Візьмемо для прикладу, ll
який є псевдонімом, ls -laF
але не може бути використаний watch
. Також у випадку, якщо вихід будь-якої команди досить довгий, ви будете мати проблеми з прокруткою за допомогою watch
. У цих кількох особливих випадках ця відповідь може виявитися кращим варіантом.
watch
принаймні дозволяє -c
або --color
параметри для кольорового виводу.
while sleep x
краще - вбити легше.
watch
, вона зберігає історію команд.
Просто хотів , щоб передати , щоб souravc і Nux відповіді «s:
watch
на Ubuntu ідеально працюватимуть, ви, можливо, захочете уникнути цього, якщо ви хочете, щоб ваш "Unix-fu" був чистим - наприклад, на FreeBSD, watch - це команда "прослуховувати інший рядок".while true; do command; sleep SECONDS; done
також є один нюанс - ваша команда може бути важче вбити з допомогою CTR + C . Можливо, ви хочете віддати перевагу while sleep SECONDS; do command; done
- перервати це не тільки коротше, але й простіше. Застереження полягає в тому, що він спочатку спить, потім виконує вашу команду, тому вам доведеться почекати деяких, SECONDS
перш ніж відбудеться перше виникнення команди.sleep
в while
цикл? Я не зміг знайти різниці, Ctrl + C миттєво перервав цикл, незважаючи ні на що.
command
і sleep
і тільки зламатися , якщо ви вбиваєте true
.
Здається, ідеальне завдання для cron
демона, яке дозволяє виконувати періодичні команди. Виконайте crontab -e
команду, щоб почати редагувати конфігурацію вашого користувача. Її формат задокументований у crontab (5) . В основному у вас є п'ять пов'язаних з часом, розділених простором полів, за якими слідує команда:
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)
Наприклад, якщо ви хочете запустити сценарій Python кожного вівторка, 11:00:
0 11 * * 1 python ~/yourscript.py
Є також деякі спеціальні імена, які замінюють час, наприклад @reboot
. Дуже корисно, якщо вам потрібно створити тимчасовий каталог. З мого crontab (з переліком crontab -l
):
# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"
cron
біжить за лаштунками, а не в терміналі
Якщо ви відстежуєте файлову систему, то inotifywait
це геніально і, безумовно, додає менше навантаження на вашу систему.
Приклад:
У першому терміналі введіть цю команду:
$ inotifywait .
Потім у другому терміналі будь-яка команда, яка впливає на поточний каталог,
$ touch newfile
Тоді в оригінальному терміналі inotifywait прокинеться та повідомить про подію
./ CREATE newfile2
Або в петлі
$ 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.
grep something InALogFile|less
, це сценарій?
.
я не можу залишити команду.
-m
до постійного моніторингу без циклу.
Ви можете створити власну repeat
команду, виконавши наступні дії; кредити тут :
Спочатку відкрийте .bash_aliases
файл:
$ xdg-open ~/.bash-aliases
По-друге, вставте ці рядки внизу файлу і збережіть:
repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
"$@"
done
}
По-третє, або закрийте і знову відкрийте свій термінал, або введіть:
$ source ~/.bash_aliases
Et voilà! Тепер ви можете використовувати його так:
$ repeat 5 echo Hello World !!!
або
$ repeat 5 ./myscript.sh
можна використовувати кронтаб. запустіть команду crontab -e
та відкрийте її у вибраному текстовому редакторі, а потім додайте цей рядок
*/10 * * * * /path-to-your-command
Це виконуватиме вашу команду кожні 10 хвилин
* */4 * * * /path-to-your-command
Це виконуватиме вашу команду кожні 4 години
$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done
X кількість разів повторити.
Y час чекати, щоб повторити.
Приклад:
$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done
Інша проблема, запропонована вище підходом до "дивитися", полягає в тому, що він відображає результат лише тоді, коли процес виконаний. "дата; сон 58; дата" відобразить дві дати лише через 59 секунд ... Якщо ви почнете щось працювати протягом 4 хвилин, яке повільно відображатиме кілька сторінок вмісту, ви його не побачите.
З іншого боку, проблема "під час" викликає занепокоєння тим, що він не враховує тривалість завдання.
while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done
З цим сценарій працюватиме десь кожні хвилини, а інколи це може зайняти 1м40. Тож навіть якщо крон зможе запускати його щохвилини, тут це не буде.
Отже, щоб побачити вихід на оболонці під час його генерування та дочекатися точного часу запиту, вам потрібно переглянути час до, і після, і циклічити з часом.
Щось на зразок:
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
Це виведе це:
Як бачите, команда виконується кожні хвилини:
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
Тому просто замініть команду "сон echo $(( ( RANDOM % 30 ) + 1 ))
" на те, що вам завгодно, і що буде виконуватися, на терміналі / оболонці, рівно щохвилини. Якщо ви хочете іншого розкладу, просто змініть "60" секунд на те, що вам потрібно.
Коротша версія без налагоджувальних рядків:
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
watch -n 1 'echo $COLUMNS'
іwatch -n 1 echo $COLUMNS
при зміні розміру вашого терміналу - перший розширюється щосекунди, але останній розгортається лише один раз передwatch
запуском.