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