ดำเนินการคำสั่งทุก ๆ X วินาที


10

ฉันต้องการที่จะดำเนินการคำสั่งนับ 10 วินาทีและมีมันดำเนินการในพื้นหลัง (จึงไม่watch?) คำตอบทั้งหมดแสดงบางอย่างเช่นต่อไปนี้ แต่จะดำเนินการ 11 ถึง 14 วินาที สิ่งนี้จะสำเร็จได้อย่างไร

while true; do
    # perform command that takes between 1 and 4 seconds
    sleep 10
done

อาจมีสัญญาณเรียลไทม์ และการจัดการก้าวกระโดดที่เหมาะสม โชคดี.
mikeserv

@mikeserv ดังนั้นไม่ต้องพยายามหรือ ฉันไม่สนใจเกี่ยวกับความแม่นยำในระดับมิลลิวินาทีเพียงแค่พูดครึ่งวินาที
user1032531

คุณพยายามทำอะไรให้สำเร็จ ฉันพบว่างานที่ต้องทำงานด้วยความถี่นั้นมักจะเป็นวิธีแก้ปัญหาสำหรับปัญหาอื่น
Sobrique

@Sririque แน่นอน ฉันกำลังพิสูจน์แนวคิดของตัวบันทึกข้อมูลแบบโพล ในความเป็นจริงมันจะถูกตั้งโปรแกรมในภาษาอื่น แต่ตอนนี้ใช้งานได้แล้ว
user1032531

คำตอบ:


16

เกี่ยวกับ:

( # In a subshell, for isolation, protecting $!
  while true; do
    perform-command & # in the background
    sleep 10 ;
    ### If you want to wait for a perform-command
    ### that happens to run for more than ten seconds,
    ### uncomment the following line:
    # wait $! ;
    ### If you prefer to kill a perform-command
    ### that happens to run for more than ten seconds,
    ### uncomment the following line instead:
    # kill $! ;
    ### (If you prefer to ignore it, uncomment neither.)
  done
)

การทางพิเศษแห่งประเทศไทย: ด้วยความคิดเห็นเหล่านั้นทางเลือกและการย่อยสำหรับการป้องกันพิเศษที่ดูซับซ้อนมากขึ้นกว่าที่มันเริ่ม ดังนั้นสำหรับการเปรียบเทียบนี่คือสิ่งที่ดูเหมือนก่อนที่ฉันจะเริ่มกังวลwaitหรือkillด้วยความ$!ต้องการและความเหงา:

while true; do perform-command & sleep 10 ; done

ส่วนที่เหลือเป็นเพียงเมื่อคุณต้องการ


คุณสามารถอธิบายเหตุผลของการถ่ายโอนข้อมูลรหัสของคุณได้หรือไม่?
Ismael Miguel

2
นอกจากนี้เพื่ออ้างอิงที่เปลือกผลงานของคุณสำหรับรหัส (ชอบคำตอบของ mikeserv) ดังนั้นคนที่ไม่ได้รับสับสนเมื่อมีพฤติกรรมที่แตกต่างกันเปลือกแตกต่างกัน :)
เถ้า

@IsmaelMiguel ฉันคิดว่าความคิดเห็นจะอธิบายเหตุผล ฉันไม่แน่ใจว่ามีอะไรไม่ชัดเจน
Sidhekin

1
คู่มือทุบตีกล่าวว่า$!: "ขยายไปยัง ID กระบวนการของงานที่วางไว้ล่าสุดในพื้นหลัง" และsleepไม่ได้ถูกวางไว้ในพื้นหลังดังนั้นไม่มันจะไม่ :)
Sidhekin

1
ว้าว. ผิดทั้งสองอย่าง เกิดขึ้นเมื่อใด
mikeserv

9

คุณสามารถทำสิ่งที่ต้องการต่อไปนี้ในbash, zshหรือksh:

SECONDS=0
while   command
do      sleep "$((10-(SECONDS%10)))"
done

นี่คือสิ่งที่bashคู่มือกล่าวเกี่ยวกับ$SECONDS:

$SECONDS

  • แต่ละครั้งที่มีการอ้างอิงพารามิเตอร์นี้จำนวนวินาทีนับตั้งแต่การเรียกใช้เชลล์ส่งคืน หากมีการกำหนด$SECONDSค่าให้ค่าที่ส่งคืนจากการอ้างอิงที่ตามมาคือจำนวนวินาทีตั้งแต่การกำหนดบวกค่าที่กำหนด ถ้า$SECONDSเป็นunsetเช่นนั้นจะสูญเสียคุณสมบัติพิเศษแม้ว่าจะถูกรีเซ็ตในภายหลัง

นี่คือตัวอย่างการทำงาน:

(   SECONDS=0
    while   sleep   "$((RANDOM%10))"
    do      sleep   "$((10-(SECONDS%10)))"
            echo    "$SECONDS"
    done
)

10
20
30
40
50
60
70
80
90
100

2
เพื่อหลีกเลี่ยงการตั้งค่าที่ต้องทำSECONDS sleep "$((10-(($SECONDS-$start_time)%10)))"คุณจะต้องทำstart_time=$SECONDSก่อนลูป
ctrl-alt-delor

@ Richard - ทำไมต้องหลีกเลี่ยง
mikeserv

เพราะวันหนึ่งคุณจะมีมันในสคริปต์ที่คุณโทรจากภายในด้วยการวนซ้ำ และคุณจะใช้เวลาทั้งวันสงสัยว่าทำไมมันไม่ทำงานอย่างถูกต้อง SECONDSในระยะสั้นจะไม่ได้รังถ้าคุณตั้งค่า การวางไข่เชลล์ย่อยในการแก้ไขล่าสุดของคุณควรหลีกเลี่ยงปัญหานี้
ctrl-alt-delor

1
@ Richard - เนื่องจากคำถามเกี่ยวกับwhile trueลูปฉันไม่ได้คิดว่าสถานะเชลล์ใด ๆ ที่คาดว่าจะอยู่รอดได้ การวนซ้ำแบบนั้นในบริบทของตัวเองมักจะเป็นการฝึกฝนที่ดีที่สุด ในสถานการณ์เช่นนั้นฉันจะเป็นห่วงtrapมากกว่าเพราะเห็นแก่มากกว่าเพื่อ$SECONDSประโยชน์
mikeserv

ขอบคุณไมค์ฉันคิดที่จะทำสิ่งที่คล้ายกัน (แต่ยังไม่ทราบวิธีการเฉพาะ) แต่ทางแก้ของ Sidhekin ดูเหมือนจะทำในสิ่งเดียวกันใช่ไหม ฉันไม่มีคุณสมบัติที่จะตัดสินใจเรื่องคำตอบที่ดีกว่านี้ แต่รู้สึกว่าจำเป็นต้องเลือกบางอย่าง
user1032531

3

BASH เท่านั้น - คุณสามารถคำนวณเวลาที่ใช้โดยคำสั่งของคุณและลบออกจาก 10:

TIMEFORMAT=$'%0R'
while true; do
    T=$({ time command; } 2>&1)
    sleep $(( 10-T ))

จากคนทุบตี:

TIMEFORMAT ค่าของพารามิเตอร์นี้ใช้เป็นสตริงรูปแบบที่ระบุว่าข้อมูลเวลาสำหรับไพพ์ไลน์นำหน้าด้วยคำที่สงวนเวลาควรถูกแสดงอย่างไร ตัวละคร% แนะนำลำดับหนีที่ขยายไปยังค่าเวลาหรือข้อมูลอื่น ๆ ลำดับการหลบหนีและความหมายมีดังนี้ เครื่องมือจัดฟันแสดงส่วนที่เป็นทางเลือก
%% A ตัวอักษร%
% [p] [l] R เวลาที่ผ่านไปเป็นวินาที
% [p] [l] U จำนวนวินาทีของ CPU ที่ใช้ในโหมดผู้ใช้
% [p] [l] S จำนวน CPU วินาทีที่ใช้ในโหมดระบบ
% P เปอร์เซ็นต์ CPU ซึ่งคำนวณเป็น (% U +% S) /% R

p ตัวเลือกเป็นตัวเลขที่ระบุความแม่นยำจำนวนของเศษส่วนหลังจุดทศนิยม ค่า 0 ทำให้ไม่มีจุดทศนิยมหรือเศษส่วนที่จะส่งออก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.