Возможно ли в командной строке linux повторять команду каждые n секунд.
Например, скажем, что у меня есть импорт, и я делаю
ls -l
чтобы проверить размер файла, увеличивается. Я хотел бы иметь команду, чтобы это автоматически повторялось.
Возможно ли в командной строке linux повторять команду каждые n секунд.
Например, скажем, что у меня есть импорт, и я делаю
ls -l
чтобы проверить размер файла, увеличивается. Я хотел бы иметь команду, чтобы это автоматически повторялось.
Смотреть каждые 5 секунд...
watch -n 5 ls -l
Если вы хотите визуально подтвердить изменения, добавьте --differences
до команды ls
.
В соответствии с man-страницей OSX также есть
Параметр --кумулятивный делает выделение "липким", представляя показывая все позиции, которые когда-либо менялись. -t или --no-title отключает заголовок, показывающий интервал, команды и текущее время в верхней части дисплея, а также после пустой строки.
Страница руководства Linux/Unix находится здесь
while true; do
sleep 5
ls -l
done
"watch" не позволяет доли секунды в Busybox, в то время как "sleep" делает. Если это имеет значение для вас, попробуйте следующее:
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", тогда вам нужно его убить. Так что любезно добавьте '&' когда вы запускаете script.
# ./while_check.sh &
Вот тот же цикл, что и script. Создайте файл "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 &
часы хороши, но очистят экран.
watch -n 1 'ps aux | grep php'
Если вы хотите избежать "дрейфа", то есть хотите, чтобы команда выполняла каждую 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
Он все еще может немного отклониться, так как сон остается точным только на одну секунду. Вы можете повысить эту точность за счет использования команды date.
Вы можете запустить следующее и отфильтровать только размер. Если ваш файл называется somefilename
вы можете сделать следующее
while :; do ls -lh | awk '/some*/{print $5}'; sleep 5; done
Одна из многих идей.
Если вы хотите сделать что-то определенное количество раз, вы всегда можете это сделать:
repeat 300 do my first command here && sleep 1.5
Чтобы свести к минимуму дрейф, используйте:
while :; do sleep 1m & some-command; wait; done
по-прежнему будет небольшое количество дрейфа из-за bash времени для запуска структуры цикла и выполнения команды sleep для фактического выполнения.
hint: ':' evals to 0 ie true.
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
Еще одна петля в bash:
Сделайте это repeat
исполняемым файлом где-нибудь в вашем $PATH
:
#!/bin/bash
n=$1
shift 1
for ((x=0; x<$n; ++x)); do
"[email protected]"
done
так что позже вы можете:
$ repeat 3 date
Краткое решение, которое особенно полезно, если вы хотите многократно запускать команду до тех пор, пока она не даст сбой, и позволит вам увидеть весь вывод.
while ls -l; do
sleep 5
done