Odpowiedzi:
Istnieje kilka zastrzeżeń dotyczących tworzenia uruchomionych plików .plist. Podsumuję je poniżej:
.plist
w odpowiednich katalogach / folderach:
~/Library/LaunchAgents
- Specyficzne dla użytkownika. Uruchomi się, gdy użytkownik będzie zalogowany./Library/LaunchAgents
- Specyficzny dla wszystkich użytkowników. Uruchomi się, gdy użytkownik (użytkownicy) jest zalogowany./Library/LaunchDaemons
- Działa niezależnie od tego, czy użytkownik (użytkownicy) jest (są) zalogowani. Musisz użyć, sudo
aby załadować.plist
Moje preferencje to # 3 (ładuj jako LaunchDaemon), więc mój skrypt zostanie wykonany niezależnie od tego, czy jestem zalogowany, czy nie. Podczas używania jako LaunchDameon należy użyć sudo
do załadowania .plist
:
sudo lauchctl load com.user.fileCleanup.plist
Uwaga: Jeśli chodzi o konwencję nazewnictwa w moim przykładzie, lubię ją używać. com.user.< name of my script >.plist
Pomaga mi to w identyfikowaniu i debugowaniu wszelkich problemów, jeśli się pojawią, i pozostaje w zgodzie z konwencją nazewnictwa Apple z com.apple.some-app.plist
To jest całkowicie opcjonalne z twojej strony.
Poniżej znajduje się skrypt, którego używam do czyszczenia plików roboczych (zmodyfikowałem go pod kątem określonych parametrów czasu). Można edytować ten plik swoim ulubionym edytorze tekstowym (używam Komodo Edit ), lecz TextEdit lub nawet nano
lub vi
z linii poleceń będą działać.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.fileCleanup</string>
<key>ProgramArguments</key>
<array>
<string>/Users/allan/Documents/Scripts/Unix/fileCleanup.sh</string>
</array>
<key>StartCalendarInterval</key>
<!-- Weekdays are 1 - 5; Sunday is 0 and 7 -->
<array>
<dict>
<key>Weekday</key>
<integer>1</integer>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
</dict>
<dict>
<key>Weekday</key>
<integer>2</integer>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
</dict>
<dict>
<key>Weekday</key>
<integer>3</integer>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
</dict>
<dict>
<key>Weekday</key>
<integer>4</integer>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
</dict>
<dict>
<key>Weekday</key>
<integer>5</integer>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
</dict>
</array>
</dict>
</plist>
Ta następna część jest opcjonalna ...
Aby uzyskać informacje zwrotne na temat wykonania moich skryptów i rezultatu, stworzyłem małą funkcję AppleScript, która wywołuje display notification
(jest dość prosta jak na moje potrzeby, ale oczywiście można ją poprawić).
on run argv
set Message to item 1 of argv
set Title to item 2 of argv
set aud to item 3 of argv
set STitle to "Terminal"
set Snd to "Blow.aiff"
if (aud = "sound") then
display notification Message with title Title subtitle STitle sound name Snd
else
display notification Message with title Title subtitle STitle
end if
end run
W moim skrypcie sprawdzam powodzenie lub niepowodzenie, w zależności od tego, co to jest (tj. Plik istniejący w określonym katalogu), wygeneruje powiadomienie. Jeśli nie, kolejne powiadomienie, ale tym razem z dźwiękiem!
#!/bin/bash
if [ -f "$SOURCE" ]
then
scp -q "$SOURCE" "$TARGET"
osascript $ASCRIPT_DIR/notify.scpt "Podcast Transfered successfully" "$TITLE -- SUCCESS" "nosound"
else
osascript $ASCRIPT_DIR/notify.scpt "The file $TARGET does not exist" "$TITLE -- ERROR" "sound"
fi
Oto przykładowy wynik:
Oto przykładowy plik .plist na pokrycie wykonywania o 2:10 rano każdego dnia tygodnia.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.me.hello</string>
<key>ProgramArguments</key>
<array>
<string>say</string>
<string>hello</string>
</array>
<key>RunAtLoad</key>
<false/>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
<key>Weekday</key>
<integer>1</integer>
</dict>
<dict>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
<key>Weekday</key>
<integer>2</integer>
</dict>
<dict>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
<key>Weekday</key>
<integer>3</integer>
</dict>
<dict>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
<key>Weekday</key>
<integer>4</integer>
</dict>
<dict>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
<key>Weekday</key>
<integer>5</integer>
</dict>
</array>
</dict>
</plist>
Jeśli nie chcesz ręcznie pisać pliku launchd
.plist , program taki jak Lingon X może być bardzo pomocny, ponieważ ułatwi również ładowanie / rozładowywanie pliku .plist .
Potrzebne polecenie to Uruchom CalendarInterval
Najłatwiej użyć programu podobnego LaunchControl lub Lingon napisać i załadować plist.
Ten przykład uruchamia / usr / bin / env w dowolnym momencie. Nie ma skrótu dla wszystkich dni tygodnia, więc musisz wymienić dni, w których niedziela to 0. Pokazałem przykład poniedziałku i wtorku
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>local.job</string>
<key>Program</key>
<string>/usr/bin/env</string>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
<key>Weekday</key>
<integer>1</integer>
</dict>
<dict>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>10</integer>
<key>Weekday</key>
<integer>2</integer>
</dict>
</array>
</dict>
</plist>