it-swarm-ru.tech

Повторите команду автоматически в Linux

Возможно ли в командной строке Linux повторять команду каждые n секунд.

Например, скажем, у меня запущен импорт, и я делаю

ls -l

чтобы проверить размер файла увеличивается. Я хотел бы получить команду, чтобы это автоматически повторялось.

284
Marty Wallace

Смотрите каждые 5 секунд ...

watch -n 5 ls -l

Если вы хотите получить визуальное подтверждение изменений, добавьте --differences перед командой ls.

Согласно справочной странице OSX, есть также

Опция --cumulative делает подсветку "липкой", отображая текущее отображение всех когда-либо измененных позиций. Параметр -t или --no-title отключает заголовок, показывающий интервал, команду и текущее время в верхней части экрана, а также следующую пустую строку.

Справочную страницу по Linux/Unix можно найти здесь

514
Rawkode
while true; do
    sleep 5
    ls -l
done
109
Oleksandr Kravchuk

"смотреть" не позволяет доли секунды в Busybox, в то время как "спать" делает. Если это важно для вас, попробуйте это:

while true; do ls -l; sleep .5; done
88
mikhail

sleep уже возвращает 0. Поэтому я использую:

while sleep 3 ; do ls -l ; done

Это немного короче, чем решение Михаила. Незначительным недостатком является то, что он спит перед первым запуском целевой команды.

28
Sebastian Wagner

Если команда содержит некоторые специальные символы, такие как каналы и кавычки, ее необходимо дополнить кавычками. Например, чтобы повторить ls -l | grep "txt", команда watch должна быть:

watch -n 5 'ls -l | grep "txt"'

18
jonathanzh

Периодический запуск команд без 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 &

13
Ranjithkumar T

смотреть хорошо, но будет чистить экран.

watch -n 1 'ps aux | grep php'
7
Eduardo

Если вы хотите избежать "дрейфа", то есть вы хотите, чтобы команда выполнялась каждые 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

Это может все еще немного дрейфовать, так как сон точен только на одну секунду. Вы можете улучшить эту точность путем творческого использования команды даты.

6
mcote

Вы можете запустить следующее и отфильтровать только размер. Если ваш файл назывался somefilename, вы можете сделать следующее

while :; do ls -lh | awk '/some*/{print $5}'; sleep 5; done

Одна из многих идей.

4
Valentin Bajrami

Если вы хотите сделать что-то определенное количество раз, вы всегда можете сделать это:

repeat 300 do my first command here && sleep 1.5
4
brightball
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
1
HeadAndTail

Чтобы свести к минимуму дрейф, используйте:

while :; do sleep 1m & some-command; wait; done

из-за времени bash для запуска структуры цикла и команды sleep для фактического выполнения все равно будет небольшой сдвиг.

подсказка: ':' сбрасывается в 0, т.е.

1
math