Det er måske ikke hverdagskost, at man har behov for at køre en opgave med en fast interval, men når man så har behov, så skal man kunne vide hvordan.
Hvis man er bekendt med BSD/*nix baserede systemer, så kender man sikkert også til cron
. Cron
er en tjeneste der gør det muligt at starte forskellige opgaver på forskellige tidspunkter, eller en fast interval. Opgaverne kan opsætte på bruger eller system niveau. MacOS er i familien af BSD baserede systemer og har derfor også cron
muligheder.
Apple har i en del år arbejdet på en anden løsning, som de kalder launchd
. Det er ikke just cron erstatning i sig selv som sådan. Det er en bredere vifte af funktioner end cron
har, men den har også funktioner til at erstatte cron
. Og det er disse jeg kommer til at omtale her.
Lad os sige at vi har behov for at kopiere indhold af en mappe og det vil gerne gøre med en fast interval f.eks. hver dag kl. 08.00.
En måde at gøre det på vil være at skrive et kort bash
script der kopiere mappens indhold over til en anden mappe. Og bagefter kalder vi dette script hver dag kl. 08.00. Process vil være mere eller mindre det samme for både cron
og launchd
job.
Så nedenfor har vi et simpel bash
script der vil kopiere indhold fra en mappe over i en anden. Der er ingenting fancy over det som sådan, blot for at illustrere funktionaliteten. Vi vil så kalde dette script med launchd
en gang om dagen, kl 08.00.
Når vi har scriptet på plads, så skal vi ind og se hvordan vi kalder scriptet på det ønskede interval/tidspunkt.
Da copy.sh
kun har til formål at kopiere en bruger mappe over til en anden, og involvere ikke noget med resten af systemet, så kan vi nøjes med at lave en launchd
opgave, på bruger niveau. Disse handlinger kaldes Agents
og alle brugere kan oprette dem for deres egen bruger, ved at lægge en fil i XML format, der slutter på .plist. Filen skal blot ligges i ~/Library/LaunchAgents
.
Når filen er oprettet og gemt, så er vi klar til at indlæse/starte filen. Man kan gøre det på to måder. Enten ved at indlæse den manuelt, eller genstarte, og så vil den indlæses ved system opstart for denne bruger. Det kan også være man kan nøjes med at logge ud og ind igen. Men dette har jeg ikke lige testet.
Håndtering af Agents
For at indlæse filen uden at genstarte, kan det gøres ved at taste nedenstående kommando i Terminalen.
launchctl load /Users/user1/Library/LaunchAgents/com.nihad.test_copy.plist
Hvis man ikke længere ønsker filen skal køre denne process, så kan man med fordel slå det fra ved at køre denne kommando:
launchctl unload /Users/user1/Library/LaunchAgents/com.nihad.test_copy.plist
StartCalendarInterval
kan indeholde en eller flere af nedenstående elementer for at oprette helt præcis kontrol af opstart. Minute
, Hour
, Weekday
, Day
, Month
.
Fast interval
Man kan udskifte StartCalendarInterval
med;
<key>StartInterval</key> <integer>300</integer>
Hvis man ønsker at starte opgaven med et fast interval, f.eks. 300 sekunder.
Lingon GUI app til alt dette …
Når alt dette er sagt, så findes der faktisk et gratis program, der kan oprette og opsætte disse jobs uden at fifle alt for meget i Terminalen.
Lingon @ Apple App Store
Holde øje med en fil …
Launchd
kan også holde øje med en fil, om den bliver ændret, og ud fra det, køre en kommando. Men det må være en anden gang jeg skriver om det.