Tôi có một số dịch vụ như thế này mà tôi muốn chạy gần như ngay lập tức sau khi các tệp được sửa đổi.
<?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>
Ngay cả khi ThrptionInterval được đặt thành 1 hoặc 0, chúng chỉ chạy tối đa cứ sau 10 giây.
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
chỉ nói rằng các chương trình không chạy hơn 10 giây theo mặc định, nhưng không đề cập đến việc ThrottInterval không thể được đặt bên dưới mức đó.
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.
Bạn có thể giữ chương trình hoặc tập lệnh chạy trong 10 giây và theo dõi các thay đổi mỗi giây:
#!/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
Hoặc tương tự trong 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
Nhưng có cách nào để bỏ qua hoặc giảm thời gian giới hạn? Nó cũng áp dụng cho các hành động thư mục.