답변:
watch
명령 을 사용할 수 있습니다 . watch 는 정기적으로 지정된 명령을 실행하는 데 사용됩니다.
터미널을 열고 다음을 입력하십시오.
watch -n x <your command>
x 를 원하는 시간 (초)으로 변경하십시오 .
watch
명령 및 해당 옵션 사용에 대한 자세한 도움말을 man watch
보려면이 링크를 실행 하거나 방문하십시오 .
예를 들면 다음과 같습니다 . 다음은 60 초 마다 동일한 터미널에 데스크탑 디렉토리의 내용을 나열하므로 변경 사항이 있는지 알 수 있습니다.
watch -n 60 ls -l ~/Desktop
watch
"history enabled"type 명령과 함께 사용할 수있는 방법이 있습니까? 나는을 사용 watch
하는 것을 좋아하지만 때로는 마지막 실행 대신 이전 실행 로그를보고 싶을 때가 있습니다. 그리고 그렇습니다. 스크립팅 ( while true
)을 사용하여이 작업을 수행 할 수 있지만 watch
유틸리티를 사용하는 것이 훨씬 깔끔합니다!
nux의 답변과 별도로 터미널 에서이 명령을 사용할 수도 있습니다.
while true; do <your_command>; sleep <interval_in_seconds>; done
예
while true; do ls; sleep 2; done
이 명령은 ls
2 초 간격으로 출력을 인쇄합니다 .
Ctrl+ C를 사용 하여 프로세스를 중지하십시오.
몇 가지 단점이 있습니다 watch
watch
-c
또는 --color
옵션을 사용하여 이스케이프 문자를 전달하는 ANSI 색상 시퀀스를 해석합니다 . 예를 들어의 출력 pygmentize
은 작동하지만 실패합니다 ls --color=auto
.위의 상황에서 이것은 더 나은 옵션으로 나타날 수 있습니다.
watch
그것을 위해 존재합니다, 이것은 내가 말하고자하는 약간 쓸모가 없습니다
watch
대부분의 경우에 좋습니다. 그래서 처음에 "nux의 답변을 제외하고"언급했습니다. 그러나 watch
예를 들어에 별명 명령을 사용할 수없는watch
문제는 거의 없습니다 . ll
별명이지만와 ls -laF
함께 사용할 수없는 예를 들어 보자 watch
. 또한 명령의 출력이 너무 길면을 사용하여 스크롤하는 데 문제가 있습니다 watch
. 이 특별한 경우에는이 답변이 더 나은 옵션으로 보일 수 있습니다.
watch
적어도 내 버전은 컬러 출력에 대한 -c
또는 --color
옵션을 허용합니다 .
while sleep x
더 나은-죽이는 것이 더 쉽습니다.
watch
, 명령 기록을 유지합니다.
souravc 와 nux 의 답변 을 듣고 싶었습니다 .
watch
우분투에서는 완벽하게 작동 하지만 "Unix-fu"를 순수하게 만들고 싶다면 FreeBSD에서 watch는 "다른 tty 라인을 스누핑"하는 명령입니다.while true; do command; sleep SECONDS; done
CTR + C를 사용하여 명령을 죽이기가 더 어려울 수도 있습니다 . 당신이 선호 할 수 있습니다 while sleep SECONDS; do command; done
- 그것은뿐만 아니라 짧은뿐만 아니라 방해 쉽다. 경고는 먼저 잠자고 명령을 실행한다는 것이므로 명령 SECONDS
이 처음 발생하기 전에 약간 기다려야 합니다.sleep
에서 어디에 배치 while
해야합니까? 나는 차이점을 찾을 수 없었습니다 .Ctrl + C는 즉시 상관없이 루프를 끊었습니다 .
command
그리고 sleep
당신이 죽일 경우에만 휴식 true
.
cron
주기적 명령을 실행할 수 있는 데몬에 이상적인 작업 인 것 같습니다 . crontab -e
명령을 실행 하여 사용자의 cron 구성 편집을 시작하십시오. 형식은 crontab (5)에 설명되어 있습니다. 기본적으로 5 개의 시간 관련 공백으로 구분 된 필드와 명령이 있습니다.
The time and date fields are:
field allowed values
----- --------------
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names, see below)
day of week 0-7 (0 or 7 is Sunday, or use names)
예를 들어 매주 화요일 오전 11시에 Python 스크립트를 실행하려면 다음을 수행하십시오.
0 11 * * 1 python ~/yourscript.py
와 같이 시간을 대체하는 특수 이름도 있습니다 @reboot
. 임시 디렉토리를 작성해야하는 경우 매우 유용합니다. 내 crontab에서 (로 나열 crontab -l
) :
# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"
cron
터미널이 아닌 무대 뒤에서 실행
파일 시스템을 모니터링하는 경우 inotifywait
훌륭하고 확실히 시스템에로드를 줄입니다.
예 :
에서 1 터미널이 명령을 입력합니다 :
$ inotifywait .
그런 다음 두 번째 터미널에서 현재 디렉토리에 영향을주는 모든 명령
$ touch newfile
그런 다음 원래 터미널에서 inotifywait가 일어나 이벤트를보고합니다.
./ CREATE newfile2
또는 루프
$ while true ; do inotifywait . ; done
Setting up watches.
Watches established.
./ OPEN newfile2
Setting up watches.
Watches established.
./ OPEN newfile2
Setting up watches.
Watches established.
./ DELETE newfile
Setting up watches.
Watches established.
./ CREATE,ISDIR newdir
Setting up watches.
Watches established.
grep something InALogFile|less
스크립트입니까?
.
내가 명령을 내릴 수없는 것보다 더 간단 할 수있는 것은 무엇입니까?
-m
에서 루프없이 지속적으로 모니터링하기 위해 추가 할 수있는 것을 보았습니다 .
repeat
다음 단계를 수행 하여 고유 한 명령을 작성할 수 있습니다 . 여기에 크레딧 :
먼저 .bash_aliases
파일을여십시오.
$ xdg-open ~/.bash-aliases
둘째, 파일의 맨 아래에 다음 행을 붙여넣고 저장하십시오.
repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
"$@"
done
}
셋째, 터미널을 닫았다가 다시 열거 나 다음을 입력하십시오.
$ source ~/.bash_aliases
vo! 이제 다음과 같이 사용할 수 있습니다.
$ repeat 5 echo Hello World !!!
또는
$ repeat 5 ./myscript.sh
crontab을 사용할 수 있습니다. 명령을 실행하고 crontab -e
원하는 텍스트 편집기로 연 다음이 줄을 추가하십시오.
*/10 * * * * /path-to-your-command
10 분마다 명령이 실행됩니다.
* */4 * * * /path-to-your-command
4 시간마다 명령이 실행됩니다.
$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done
반복 할 X 횟수입니다.
반복 대기하는 Y 시간.
예 :
$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done
위에서 제안한 "감시"접근 방식의 또 다른 문제는 프로세스가 완료된 경우에만 결과를 표시한다는 것입니다. "date; sleep 58; date"는 59 초 후에 만 2 개의 날짜를 표시합니다. 4 분 동안 실행중인 항목을 시작하면 여러 페이지의 콘텐츠가 느리게 표시되면 실제로 볼 수 없습니다.
반면에 "while"접근 방식은 작업 시간을 고려하지 않습니다.
while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done
이를 통해 스크립트는 1 분마다 실행되며 1m40이 소요될 수 있습니다. 따라서 cron이 1 분마다 실행할 수는 있지만 여기서는 그렇지 않습니다.
따라서 셸에서 출력이 생성 될 때 출력을보고 정확한 요청 시간을 기다리려면 이전과 이후의 시간을 확인하고 while을 반복해야합니다.
다음과 같은 것 :
while ( true ); do
echo Date starting `date`
before=`date +%s`
sleep `echo $(( ( RANDOM % 30 ) + 1 ))`
echo Before waiting `date`
after=`date +%s`
DELAY=`echo "60-($after-$before)" | bc`
sleep $DELAY
echo Done waiting `date`
done
이것은 이것을 출력합니다 :
보다시피, 명령은 1 분마다 실행됩니다.
Date starting Mon Dec 14 15:49:34 EST 2015
Before waiting Mon Dec 14 15:49:52 EST 2015
Done waiting Mon Dec 14 15:50:34 EST 2015
Date starting Mon Dec 14 15:50:34 EST 2015
Before waiting Mon Dec 14 15:50:39 EST 2015
Done waiting Mon Dec 14 15:51:34 EST 2015
따라서 "sleep echo $(( ( RANDOM % 30 ) + 1 ))
"명령을 원하는 것으로 바꾸면 터미널 / 쉘에서 정확히 1 분마다 실행됩니다. 다른 일정을 원하면 "60"초만 변경하면됩니다.
디버그 라인이없는 짧은 버전 :
while ( true ); do
before=`date +%s`
sleep `echo $(( ( RANDOM % 30 ) + 1 ))` # Place you command here
after=`date +%s`
DELAY=`echo "60-($after-$before)" | bc`
sleep $DELAY
done
watch -n 1 'echo $COLUMNS'
와watch -n 1 echo $COLUMNS
크기를 조정할 때 차이점을 시도하십시오 . 전자는 매 초마다 확장되지만 후자는 시작 하기 전에 한 번만 확장watch
됩니다.