2010-10-18 39 views
15

Tôi chỉ muốn một tập lệnh bash chạy 5 phút sau khi được gọi. Tôi đang làm gì sai?bash script để chạy trong 5 phút

Tôi có lệnh:

/path/to/my/script | at now + 5 min 

Tuy nhiên kịch bản chạy ngay lập tức mọi lúc.

Trả lời

42

Bạn đang thực hiện kịch bản ngay lập tức và gửi sản lượng của nó vào at. Bạn cần phải gửi tên của kịch bản mình thành at:

echo /path/to/my/script | at now + 5 min 
+5

Và liệu downvoter có cần giải thích không? –

22

thế nào về:

sleep 300 && /path/to/my/script 
+6

Yeah, qu này estion không thực sự cần 'at'. Tôi khuyên bạn nên sử dụng '&&' thay vì ';', vì vậy nó có thể bị hủy bỏ. –

+0

Jack tăng cường tốt đẹp –

+0

ở chế độ imo duyên dáng hơn vì nó không treo quá trình. – Eddie

1

lệnh được đánh giá trái sang phải, vì vậy đầu tiên kịch bản của bạn được thực hiện, đầu ra của nó sẽ được đường ống để theo lệnh, đây là hành vi bình thường . Hãy xem số at man pages để biết thêm thông tin.

1

Sự cố là bạn đang chạy tập lệnh và chuyển đầu ra sang lệnh at. Những gì bạn cần làm là chạy lệnh at với đường dẫn đến tập lệnh của bạn dưới dạng tham số. Tôi không chắc về cú pháp, nhưng at -h hoặc man at sẽ giúp ích.

6
at -f /path/to/my/script -t now +5 minutes 

Điều này sẽ hoạt động như sắp xếp một tập lệnh chạy vào một thời điểm cụ thể. Để biết thêm thông tin về lệnh "at", hãy thử linuxmanpages.com. Tôi có thể nghĩ sai (hiện tại không có hệ thống Linux để kiểm tra).

Chúc may mắn anyways

0

thử

sys.scheduled_run /path/to/my/script 5

chức năng chính này

function sys.scheduled_run(){ 
    local PATH_TO_ACTION MINS SLEEPTIME 
    PATH_TO_ACTION=$1 
    MINS=$2 
    SLEEPTIME=$(($MINS * 60)) 
    echo "Sleeping for $MINS minute ($SLEEPTIME seconds) and then running $PATH_TO_ACTION" 
    ui.countdown $SLEEPTIME 
    $PATH_TO_ACTION 
    echo "Done" 
    if [ "REPEAT" == "$3" ] 
    then 
     echo "Going for Repeat" 
     sys.scheduled_run "[email protected]" 
    fi 
} 

chức năng đếm ngược

function ui.countdown(){ #USAGE ui.countdown 60 countdown for 60 seconds 
     local SECONDS=$1 
     local START=$(date +%s) 
     local END=$((START + SECONDS)) 
     local CUR=$START 
     while [[ $CUR -lt $END ]] 
     do 
       CUR=$(date +%s) 
       LEFT=$((END-CUR)) 

       printf "\r%02d:%02d:%02d" \ 
         $((LEFT/3600)) $(((LEFT/60)%60)) $((LEFT%60)) 

       sleep 1 
     done 
     echo "  " 
} 
Các vấn đề liên quan