Køre en opgave på et bestemt tidspunkt eller fast interval (Launchd)

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.

copy.sh der har til formål at kopiere indhold af mappen over i en anden.

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.

Læg mærke til at Label string skal helst hedde det samme som filen.

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.