Ich habe einige Dienste wie diesen, die ich fast sofort ausführen möchte, nachdem Dateien geändert wurden.
<?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>
Selbst wenn ThrottleInterval auf 1 oder 0 gesetzt wurde, werden sie höchstens alle 10 Sekunden ausgeführt.
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
sagt nur, dass Programme standardmäßig nicht mehr als alle 10 Sekunden ausgeführt werden, erwähnt aber nicht, dass ThrottleInterval nicht darunter eingestellt werden konnte.
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.
Sie können das Programm oder Skript 10 Sekunden lang laufen lassen und jede Sekunde auf Änderungen achten:
#!/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
Oder dasselbe in 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
Aber gibt es eine Möglichkeit, das Zeitlimit zu umgehen oder zu verkürzen? Dies gilt auch für Ordneraktionen.
Wenn Sie ein Skript öfter als alle 10 Sekunden starten müssen, kann es im Hinblick auf "Forking" teuer sein (lesen Sie: Zuweisen von Speicher, Starten neuer Prozesse usw.).
Daher ist es in diesem Fall am besten, einen eigenen " Daemon " zu schreiben (Programm, was im Hintergrund läuft)
Ich empfehle Ihnen, eine "leistungsfähigere" Sprache als BASH zu verwenden (mein Favorit ist "Perl", aber Ruby ist auch in Ordnung), da ein guter Daemon Timeouts, Alarme usw. verarbeitet - Dinge, die in Pure Bash zu schwer zu implementieren sind. (Natürlich kann der Daemon auch Ihre Bash-Skripte ausführen - falls erforderlich). Die Grundlagen sind:
In der Perl-Welt gibt es bereits Module, die Ihr Skript als "Daemon" -Prozess optimieren, zum Beispiel Proc :: Daemon . Ich habe keine Erfahrung mit Rubin, aber dieser Artikel kann Ihnen helfen.
Sie können Ihren Daemon-Prozess über Launchd beim Systemstart oder über die Automator-App beim Anmelden oder manuell über das Terminal starten.
quelle