Возможно ли в командной строке Linux повторять команду каждые n секунд?
Скажем, у меня запущен импорт, и я делаю
ls -l
проверить, увеличивается ли размер файла. Я хотел бы получить команду, чтобы это повторилось автоматически.
Возможно ли в командной строке Linux повторять команду каждые n секунд?
Скажем, у меня запущен импорт, и я делаю
ls -l
проверить, увеличивается ли размер файла. Я хотел бы получить команду, чтобы это повторилось автоматически.
Ответы:
Смотрите каждые 5 секунд ...
watch -n 5 ls -l
Если вы хотите получить визуальное подтверждение изменений, добавьте --differences
доls
командой.
Согласно справочной странице OSX, есть также
Опция --cumulative делает подсветку «липкой», отображая текущее отображение всех когда-либо измененных позиций. Параметр -t или --no-title отключает заголовок, показывающий интервал, команду и текущее время в верхней части экрана, а также следующую пустую строку.
Справочную страницу по Linux / Unix можно найти здесь
watch mysql dbname -e \"show processlist\;\"
brew install watch
while true; do
sleep 5
ls -l
done
watch
также имеет неприятный побочный эффект очистки экрана, поэтому иногда цикл полезен. Какой из них использовать, зависит от желаемого формата вывода.
--differences
их для выделения (если вас беспокоит перекраска терминала)
watch
. Часы не работают, например, когда вы хотите генерировать случайное число в каждом вызове, например watch -n 1 echo ${RANDOM}
. Случайный будет вызван только один раз.
«смотреть» не позволяет доли секунды в Busybox, в то время как «спать» делает. Если это важно для вас, попробуйте это:
while true; do ls -l; sleep .5; done
sleep
уже возвращается 0
. Поэтому я использую:
while sleep 3 ; do ls -l ; done
Это немного короче, чем решение Михаила. Небольшим недостатком является то, что он спит перед первым запуском целевой команды.
Если команда содержит некоторые специальные символы, такие как каналы и кавычки, ее необходимо дополнить кавычками. Например, чтобы повторить ls -l | grep "txt"
, команда watch должна быть:
watch -n 5 'ls -l | grep "txt"'
Периодически запускать команды без cron возможно, когда мы идем с while
.
Как команда:
while true ; do command ; sleep 100 ; done &
[ ex: # while true; do echo `date` ; sleep 2 ; done & ]
Пример:
while true
do echo "Hello World"
sleep 100
done &
Не забывайте последнее, так &
как оно поместит ваш цикл в фоновом режиме. Но вам нужно найти идентификатор процесса с помощью команды "ps -ef | grep your_script", а затем убить его. Поэтому, пожалуйста, добавьте «&» при запуске скрипта.
# ./while_check.sh &
Здесь тот же цикл, что и в сценарии. Создайте файл while_check.sh и поместите в него:
#!/bin/bash
while true; do
echo "Hello World" # Substitute this line for whatever command you want.
sleep 100
done
Затем запустите его, набрав bash ./while_check.sh &
echo $!
после запуска каждого фонового процесса - это PID последнего дочернего процесса, запущенного в фоновом режиме.
echo `date`
это просто плохой и слегка глючный способ написать просто date
. (Ошибка связана с отсутствием цитирования аргумента echo
.) Смотрите также бесполезное использование echo
.
Если вы хотите избежать «дрейфа», то есть вы хотите, чтобы команда выполнялась каждые N секунд, независимо от того, сколько времени она занимает (предполагая, что она занимает менее N секунд), вот некоторый bash, который будет повторять команду каждые 5 секунд с вторая точность (и выведет предупреждение, если оно не успевает):
PERIOD=5
while [ 1 ]
do
let lastup=`date +%s`
# do command
let diff=`date +%s`-$lastup
if [ "$diff" -lt "$PERIOD" ]
then
sleep $(($PERIOD-$diff))
elif [ "$diff" -gt "$PERIOD" ]
then
echo "Command took longer than iteration period of $PERIOD seconds!"
fi
done
Это может все еще немного дрейфовать, так как сон точен только на одну секунду. Вы можете улучшить эту точность путем творческого использования команды даты.
Если вы хотите сделать что-то определенное количество раз, вы всегда можете сделать это:
repeat 300 do my first command here && sleep 1.5
for x in {1..300} ; do
команд bash do||break;sleep 1.5; done
Вы можете запустить следующее и отфильтровать только размер. Если ваш файл был вызван, somefilename
вы можете сделать следующее
while :; do ls -lh | awk '/some*/{print $5}'; sleep 5; done
Одна из многих идей.
Чтобы свести к минимуму дрейф легче, используйте:
while :; do sleep 1m & some-command; wait; done
из-за времени bash на запуск структуры цикла и команды sleep для фактического выполнения все равно будет небольшой сдвиг.
подсказка: ':' имеет значение 0, т.е.
watch -n 5 'ls -l
Будет запускать ls -l
команду через каждые 5 секунд
Every 5.0s: ls -l Fri Nov 17 16:28:25 2017
total 169548
-rw-rw-r-- 1 sachin sachin 4292 Oct 18 12:16 About_us_Admission.doc
-rw-rw-r-- 1 sachin sachin 865 Oct 13 15:26 About_us_At_glance.doc
-rw-rw-r-- 1 sachin sachin 1816 Oct 13 16:11 About_us_Principle.doc
-rw-rw-r-- 1 sachin sachin 1775 Oct 13 15:59 About_us_Vission_mission.doc
-rw-rw-r-- 1 sachin sachin 1970 Oct 13 16:41 Academic_Middle_school.doc
-rw-rw-r-- 1 sachin sachin 772 Oct 16 16:07 academics_High_School.doc
-rw-rw-r-- 1 sachin sachin 648 Oct 16 13:34 academics_pre_primary.doc
-rw-rw-r-- 1 sachin sachin 708 Oct 16 13:39 academics_primary.doc
-rwxrwxr-x 1 sachin sachin 8816 Nov 1 12:10 a.out
-rw-rw-r-- 1 sachin sachin 23956 Oct 23 18:14 Ass1.c++
-rw-rw-r-- 1 sachin sachin 342 Oct 23 22:13 Ass2.doc
drwxrwxr-x 2 sachin sachin 4096 Oct 19 10:45 Backtracking
drwxrwxr-x 3 sachin sachin 4096 Sep 23 20:09 BeautifulSoup
drwxrwxr-x 2 sachin sachin 4096 Nov 2 00:18 CL_1
drwxrwxr-x 2 sachin sachin 4096 Oct 23 20:16 Code
drwxr-xr-x 2 sachin sachin 4096 Nov 15 12:05 Desktop
-rw-rw-r-- 1 sachin sachin 0 Oct 13 23:12 doc
drwxr-xr-x 4 sachin sachin 4096 Nov 6 21:18 Documents
drwxr-xr-x 27 sachin sachin 12288 Nov 17 13:23 Downloads
-rw-r--r-- 1 sachin sachin 8980 Sep 19 23:58 examples.desktop
Краткое решение, которое особенно полезно, если вы хотите выполнить команду несколько раз, пока она не завершится с ошибкой, и позволяет увидеть весь вывод.
while ls -l; do
sleep 5
done