Автоматическая повторная команда в 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