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.
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.
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
thế nào về:
sleep 300 && /path/to/my/script
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ỏ. –
Jack tăng cường tốt đẹp –
ở chế độ imo duyên dáng hơn vì nó không treo quá trình. – Eddie
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.
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.
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
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 " "
}
Và liệu downvoter có cần giải thích không? –