일정 시간이 지난 후 실행 명령?


23

긴 프로세스를 실행하는 경우 시간 기반 명령을 실행할 수있는 방법이 있습니까?

예를 들어, 나는 대략 10 분 동안 실행되는 정말 긴 프로세스를 실행하고 있습니다.

5 분 후에 별도의 명령을 실행하고 싶습니다. 예를 들어 별도의 명령은 다음과 같습니다.echo 5 minutes complete

(참고 : 명령 완료를 향한 진행을 원하지 않고 지정된 간격 후에 명령을 실행하기 만하면됩니다.)

가능합니까?


1
대부분의 경우 프로세스가 얼마나 오래 걸릴지 미리 알 수 없습니다.
choroba

"시간 기반 명령"이란 무엇입니까? 진행률 표시 줄을 작성 하시겠습니까? 질문의 현재 문구에 따라 백그라운드에서 장시간 실행되는 명령을 넣은 다음 시스템 시계를 표시 할 수 있습니다. 명확히하십시오.
와일드 카드

@Wildcard 나는 질문에서 명확히했다. 진행률 표시 줄이 아닙니다. 일정 간격 후에 명령을 실행합니다
Aniket Bhattacharyea

1
"5 분 완료"는 반향을 일으키는 이상한 일입니다. "5 분이 경과하지 않았습니다"? "시간이 _____"가 아닙니까? 다른 임의의 명령이 실행되기 전에 장기 실행 명령이 시작된 시간부터 지정된 시간 간격이 경과되도록 하시겠습니까? 그렇다면 왜 그냥 달리지 longcommand & sleep 300 && command-to-do-after-five-minutes않겠습니까? (실제로 아마도 당신이 찾고있는 것일 것입니다.) 당신은 명확하게 충분하지 않았습니다.
와일드 카드

답변:


29

그냥 실행 :

long-command & sleep 300; do-this-after-five-minutes

do-this-after-five-minutes5 분 이상 실행 얻을 것이다. 는 long-command백그라운드에서 실행됩니다.


10
나는 보통을 사용 sleep 5m && foobar하므로 마음을 바꾸고 ^ C sleep를하면 다음 명령이 실행되지 않습니다.
Peter Cordes

@PeterCordes, 예를 들어 sleep 3; lsand로 테스트했을 때 ^C두 번째 명령이 실행되지 않습니다. 왜 대화식이 아닌 쉘에서 왜 그리고 다르게 작동하는지 확실하지 않습니까?
와일드 카드

1
@PeterCordes 셸마다 다르지 않은 한. 때 sleep 5m && echo자고 일시 중단 할 때, 단지 sleep명령이 일시 중단됩니다. 나머지 명령 줄은 실행되지만 sleep일시 중단 된 후에 &&는 성공적으로 종료되지 않았으며 이후 부분 은 건너 뜁니다. 일시 중지를 시도 sleep 5 || echo hello하고 hello를 누르면 바로 표시됩니다 ^Z.
hvd

1
@ hvd : 네, 맞아, bash4를 사용하여 다시>. <입니다. &&가 빈민가 at(1), sleep 30m && mplayer something.mp3경보 알림 또는 sleep 90m && fg나중에 디스크 집중 명령을 재개하는 방법이라고 결정한 지 너무 오래되었습니다 . 실제로 다음 명령을 전혀 실행하지 않고 일시 중단 sleep 5m && echo hello하기 때문에 좋습니다 . 절전 모드가 종료되기 전에도 전체 복합 명령을 일시 중지 / 다시 시작하려면을 사용하십시오 . ^Zsleep( sleep 2 && echo hello )
Peter Cordes

@ hvd : &&관용구는 수면이 실행 된 직후에 프로세스를 종료하지 않도록 절대적으로 확신합니다 (왜냐하면 ^Z위험을 감수하는 대신 명령을 실행할 수 없기 때문입니다 ^C). 재개중인 명령이 느리게 진행되는 경우 sleep && fg또는 sleep && bg유스 케이스에 유용합니다 .
Peter Cordes

5

이 스크립트를 사용할 수 있습니다 :

#!/bin/bash

TEMPFILE="$(mktemp)"
STARTTIME="$(date +%s)"
(./longprocess; rm -f "$TEMPFILE") &
while [ -f "$TEMPFILE" ]; do
    sleep 1s
    NOW="$(date +%s)"
    if (( (NOW-STARTTIME) % 300 == 0 )); then
        echo "$(( (NOW-STARTTIME)/60 )) minute(s) elapsed"
    fi
done
echo "Done!!!"

그것은 당신을 실행 longprocessA의 sub-shell존재에 대한 다음 모니터는 이전에 만든 '잠금'파일.


2
확인 man bash을 위해 SECONDS. 당신은 설정할 수 있습니다 SECONDS=0스크립트 시작 만 더 확인 또는 300 세트에 동일 SECONDS=$((date +%s))하고 사용하는 것을 잊지 date... 스크립트 다시

@ yeti, 힌트 주셔서 감사합니다, 나는 그것을 몰랐습니다.
Serge

@yeti, 만약 당신이 sleep 1s항상 이전보다 정확히 1 초 늦게 지내고 나서 시간에 의존하고 싶다면 프로그래머는 시간에 대해 믿는 거짓에sleep 1s 빠졌다 . (이 경우 해시 마크 진행률 표시 줄이나 다른 것을 표시 할 수도 있습니다.)
Wildcard

@Wildcard ... 나는 전혀 언급하지 않았다 sleep!

@yeti, 그렇습니다. 에 대한 팁 주셔서 감사합니다 SECONDS! :)
와일드 카드

4

이에 대한 하나의 라이너가 있습니다.

( ( sleep $TIMEOUT ; echo "5 minutes complete") & $COMMAND )

귀하의 경우 TIMEOUT = 5m이고 COMMAND는 긴 명령입니다.

또한 '서비스 네트워크 다시 시작' 이있는이 게시물 시간 초과에 대한 내 답변을 참조하십시오


포 그라운드에서 서브 쉘을 시작한 다음 명령을 실행하는 것은 불필요하게 복잡해 보입니다. 외부 괄호와 exec를 제거합니다.
glenn jackman

1
@glennjackman이 방법으로 CTRL + C (예를 들어)를 주 (가장 바깥 쪽) 하위 셸로 보내는 전체 절차를 종료 할 수 있습니다.
coffeMug

1
그러나 exec를 사용하면 더 이상 하위 쉘이 없으며 명령 만 있습니다. 명령의 부모는 마치 서브 쉘을 전혀 사용하지 않은 것처럼 스크립트를 실행하는 쉘입니다.
glenn jackman

3
#! /bin/bash

( sleep 4 ) & # <-- The long running process.

seconds=1
while jobs %1 &>/dev/null ; do
    echo $((seconds++)) seconds complete
    sleep 1    
done
echo Done.

jobs %1 작업 % 1이 중지되면 실패합니다.

더 긴 시간 동안 $ seconds는 실시간과 동기화되지 않을 수 있습니다. 시작 시간을 저장하고 실제 시간과의 차이를 계산하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.