สามารถเรียกใช้โปรแกรมที่เรียกใช้บ่อยกว่าทุก ๆ 10 วินาทีได้หรือไม่?


8

ฉันมีบริการบางอย่างเช่นนี้ที่ฉันต้องการเรียกใช้เกือบจะทันทีหลังจากแก้ไขไฟล์

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN
http://www.apple.com/DTDs/PropertyList-1.0.dtd>
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>test</string>
    <key>ProgramArguments</key>
    <array>     
        <string>say</string>
        <string>a</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Users/username/Desktop/</string>
    </array>
</dict>
</plist>

แม้ว่า ThrottleInterval จะถูกตั้งค่าเป็น 1 หรือ 0 พวกมันจะวิ่งมากที่สุดทุกๆ 10 วินาที

9/9/12 4:57:05.457 PM com.apple.launchd.peruser.501[138]: (test) Throttling respawn: Will start in 7 seconds
9/9/12 4:57:09.541 PM com.apple.launchd.peruser.501[138]: (test) Throttling respawn: Will start in 3 seconds

man launchd.plist เพียงบอกว่าโปรแกรมไม่ทำงานมากกว่า 10 วินาทีตามค่าเริ่มต้น แต่ไม่ได้กล่าวถึงว่า ThrottleInterval ไม่สามารถตั้งค่าด้านล่างได้

ThrottleInterval <integer>
This key lets one override the default throttling policy imposed on jobs by launchd.
The value is in seconds, and by default, jobs will not be spawned more than once
every 10 seconds.  The principle behind this is that jobs should linger around just
in case they are needed again in the near future. This not only reduces the latency
of responses, but it encourages developers to amortize the cost of program invoca-
tion.

คุณสามารถให้โปรแกรมหรือสคริปต์ทำงานต่อไปเป็นเวลา 10 วินาทีและคอยดูการเปลี่ยนแปลงทุก ๆ วินาที:

#!/bin/bash

start=$(date +%s)
prev=

until (( $(date +%s) >= $start + 10 )); do
    new=$(stat -f %m ~/Desktop/)
    [[ $prev != $new ]] && say a
    prev=$new
    sleep 1
done

หรือเหมือนกันใน Ruby:

#!/usr/bin/env ruby

start = Time.now
prev = nil

until Time.now >= start + 10
  current = File.mtime("#{ENV['HOME']}/Desktop/")
  `say a` if current != prev
  prev = current
  sleep 1
end

แต่มีวิธีที่จะข้ามหรือลดเวลาที่กำหนดหรือไม่? นอกจากนี้ยังนำไปใช้กับการกระทำของโฟลเดอร์

คำตอบ:


9

ไม่มีทางเลี่ยงหรือลดการ จำกัด เวลาได้

เอกสารประกอบของ Apple เกี่ยวกับการสร้างงาน Launchdระบุต่อไปนี้:

สิ่งสำคัญหาก daemon ของคุณปิดตัวลงอย่างรวดเร็วหลังจากเปิดตัว Launchd อาจคิดว่ามันทำงานผิดพลาด Daemons ที่ดำเนินการต่อพฤติกรรมนี้อาจถูกระงับและไม่เปิดตัวอีกครั้งเมื่อมีคำขอในอนาคตมาถึง เพื่อหลีกเลี่ยงปัญหานี้อย่าปิดเครื่องเป็นเวลาอย่างน้อย 10 วินาทีหลังจากเปิดตัว

โปรแกรมหรือสคริปต์ของคุณต้องทำงานต่อเนื่องเป็นเวลาอย่างน้อย 10 วินาที พิจารณาการนำลูปไปใช้เพื่อตรวจสอบวันที่แก้ไขไฟล์ในช่วงสิบวินาทีที่ผ่านมาหลับเป็นเวลาสิบวินาทีและทำซ้ำ

หรือคุณสามารถรับชมไฟล์ที่ต้องการได้โดยใช้kqueueหรือ FSEvents API คำถามนี้ StackOverflow อาจจะเป็นประโยชน์, ไฟล์ระดับแจ้งเตือนการเปลี่ยนแปลงระบบแฟ้มใน Mac OS X


2

คุณสามารถให้สคริปต์ของคุณทำงานในการตรวจสอบลูปสำหรับไฟล์ที่ถูกแก้ไขแทนการเลิกเมื่อทำเสร็จแล้ว ให้รอสักครู่หลังจากตรวจสอบไฟล์ที่แก้ไขแล้ว หากพบไฟล์ที่แก้ไขให้ดำเนินการต่อด้วยสคริปต์ ถ้าไม่นอนอีก

จากนั้นให้ launchd เริ่มต้นสคริปต์ของคุณทุก ๆ x นาทีในกรณีที่การรันครั้งก่อนตาย กำหนดรหัสเริ่มต้นของสคริปต์ของคุณเพื่อตรวจสอบว่ามีอินสแตนซ์อื่นกำลังทำงานอยู่หรือไม่และหากเป็นเช่นนั้น


ดูเหมือนว่า launchd จะไม่เริ่มต้นอินสแตนซ์อื่นหากอันก่อนหน้านี้ยังคงทำงานอยู่
Lri

launchd จะไม่เรียกใช้งานตั๋วงานเดียวกันหลายอินสแตนซ์
Graham Miln

1

หากคุณต้องการเริ่มต้นสคริปต์บ่อยกว่าทุก ๆ 10 วินาทีมันอาจมีราคาแพงในแง่ของ "การฟอร์ก" (อ่าน: การจัดสรรหน่วยความจำการเริ่มต้นกระบวนการใหม่ ฯลฯ )

ดังนั้นในกรณีนี้ดีที่สุดในการเขียน " daemon " ของคุณเอง(โปรแกรมสิ่งที่ทำงานในพื้นหลัง)

ฉันขอแนะนำให้คุณใช้ภาษาที่ "มีความสามารถมากขึ้น" ในการทุบตี (ที่ชื่นชอบคือ "perl" แต่ ruby ​​ก็ใช้ได้เช่นกัน) เนื่องจาก daemon ที่ดีจะจัดการกับการหมดเวลาสัญญาณเตือนและอื่น ๆ - สิ่งที่ยากเกินไป (แน่นอนว่า daemon สามารถรันสคริปต์ทุบตีของคุณได้เช่นกันหากจำเป็น) พื้นฐานคือ:

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

ในโลกของ Perl อยู่แล้วโมดูลสิ่ง tuns สคริปต์ของคุณเป็น "ภูต" กระบวนการเช่นพร :: ภูต ฉันไม่มีประสบการณ์กับทับทิม แต่บทความนี้สามารถช่วยคุณได้

คุณสามารถเริ่มกระบวนการภูตของคุณผ่าน Launchd เมื่อเริ่มต้นระบบหรือจากแอป Automator เมื่อคุณเข้าสู่ระบบหรือจาก Terminal ด้วยตนเอง

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