Just nu i M3-nätverket
Gå till innehåll
xeric

Cron och Launchd

Rekommendera Poster

xeric

Cron och Launchd
Tänkte skriva lite om Cron och Launchd, och hur man kan använda dem. Båda hanterar och gör s k schemalagda processer. Cron har funnits länge och används (i viss mån) än idag, men för rätt många systemversioner sen gick OS X över till en egen variant av cron: launchd (launchctl). Det mesta ligger där idag och används till olika ändamål, som olika tjänster, startobjekt osv. Mycket av allt som "körs".

På Mac'en rullar det som oftast på av sig själv, allt som görs/kör och som man vill ha gjort. Men ibland kan det vara bra att kunna lägga till lite eget om man vill (och tycker det är lite kul). :)

- - -

Skriver i separata inlägg, så det inte blir ett enda långt av allt.

Cron (crontab)
Launchd (launchctl)
Exempel

Redigerad av iEricF
  • Rösta upp 1

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
xeric

Cron (crontab)
Som sagt - "cron" används inte så mkt idag på Mac'en så jag skall inte skriva så mkt om det mer än lite hur det funkar, och som jämförelse. Cron är bra, men kan vara lite svårt. Själv tycker jag launchd är bättre till vardags, men cron har en fördel att man kan ställa in mer exakta och mer komplicerade tidsintervall, även om man kan ställa in en hel del med launchd också. Men men...

Själva upplägget (syntaxen) ser ut såhär:

Minut Timme Datum Månad Veckodag Kommando

Exempel, utan några värden:

* * * * * say Hej

Varje minut säger datorn: Hej

För att köra med olika intervaller kan det set ut såhär:

# var 10'e minut
*/10 * * * * say Hej

# Varje Måndag och Fredag klockan 12
* 12 * * Mon,Fri say Hej

Den sista, själva kommandot kan lika gärnma vara en fil eller ett shellscript som körs.

* * * * * /Users/Namn/ShellScripts/exempel.sh

För att lägga in använder man crontab.

crontab -e

Sen skriver man in sin(a) rad(er) med kod.

För att läsa vad som finns där...

crontab -l

Även kolla andra användares crontab

crontab -u Sven-Allers -l

Att ta bort aktuell crontab

crontab -r

Sen kan man göra mkt mer, och ställa in olika saker, ange mailadress så man få notis via mail osv. Och det finns även lite specialtaggar (@yearly, @montly osv). Men som sagt, cron används inte så mkt idag på Mac'en, så om man inte har några jobbigt knepiga grejjer och körscheman så är launchd mkt bättre och enklare. Framförallt har man bättre koll på allt eftersom det jobbar med separata filer.

Resurser:
cron(8)
crontab(1)
Linux Crontab: 15 Awesome Cron Job Examples

Redigerad av iEricF
  • Rösta upp 1

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
xeric

Launchd (launchctl)
OS X egna variant på cron kan man säga. Den startar och kör olika saker, tjänster osv. Fördelen med launchd är att det är lätt att starta/stoppa ändra i filerna. Och filerna är uppbyggda lite på samma sätt som ".plist" ... dvs med XML.

Vad man kan göra med det är t ex att göra egna startup-script, egen loggning av något, eller köra egna script som t ex städar/rensar nåt på datorn. Precis som man kan schemalägga aktiviteter i CCC (Carbon Copy Cloner) kanske man har ett eget skript man vill köra nåt annat.

För att göra egna, kan man lätt skriva en själv (lägger med en exempelfil i slutet), eller använda program som "Lingon". Lingon finns på AppStore, och kostar väl ngn krona, Finns också en äldre version (2.1.1) som ligger på SourceForge och som inte kostade något. Är den jag kör med.

Lingon 3
Lingon 2 (10.6.8)
Lingon 2.1.1

Lingon 2.1.1 är den jag kör. Funkar bra på Lion, och förmodligen på senare med.

Filerna läggs (kan läggas) i mappen "LaunchAgents". De finns på 3 ställen i datorn.

  • ~/Library/LaunchAgents
  • /Library/LaunchAgents
  • /System/Library/LaunchAgents

Är bra att skilja dem åt. Den första är för användare. I den andra kan man lägga filer som skall/kan köras på alla användare och den sista ligger det som systemet kör. Där bör man inte lägga några "egna".

Så om man går igenom en fil lite grann.

"Skalet". Såsom alla filer börjar och slutar.

<?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>
	// innehåll
</dict>
</plist>

Nu kan man fylla det med olika innehåll.
Hela plist-uppbyggnaden består oftast av ett namn och ett värde (ibland flera värden). <key> och <value>

I Label anger man samma som filen heter, minus ".plist".

<key>Label</key>
<string>com.namn.exempel</string>

ProgramArguments.
Här kan man ange/dela upp olika saker, men om man kör ett script ser det ut såhär:

<key>ProgramArguments</key>
<array>
	<string>/Users/Namn/ShellScripts/exempelscript.sh</string>
</array>

Om man kör ett kommando direkt i filen, som i cron-exemplen, akn det se ut såhär istället:

<key>ProgramArguments</key>
<array>
	<string>/usr/bin/open</string>
	<string>-a</string>
	<string>TextEdit</string>
</array>

Sökvägen till programmet som kör.
Ev "handlers" (eg -a)
osv...

Vilket i Terminalen skulle skrivas: open -a TextEdit

Köras vid uppstart? (true, false)

<key>RunAtLoad</key>
<true/>

Intervall, i sekunder. (3600 = 1 tim)

<key>StartInterval</key>
<integer>3600</integer>

Som alternativ kan man köra med "StartCalendarInterval" för att specificera andra intervall.

<key>StartCalendarInterval</key>
<dict>
	<key>Hour</key>
	<integer>3</integer>
	<key>Minute</key>
	<integer>15</integer>
</dict>

Sen finns ett par fler med bland annat för Output och Errors.

<key>StandardErrorPath</key>
<string>/sökväg/till/errorfil.log</string>
<key>StandardOutPath</key>
<string>/sökväg/till/loggfil.log</string>

Även Disabled kan man ange (true, false)

<key>Disabled</key>
<true/>

För att manuellt starta och stoppa dem.

launchctl load -w /sökväg/till/skriptet/com.exempel.plist
launchctl unload -w /sökväg/till/skriptet/com.exempel.plist

Annars går det att starta om bara efter att man har ändrat "Disabled" och "RunAtLoad" i filerna.

- - -

Ett färdigt exempel kan se ut så här:

<?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.namn.exempel</string>
	<key>ProgramArguments</key>
	<array>
		<string>/Users/Namn/ShellScripts/mittskript.sh</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
	<key>StartInterval</key>
	<integer>3600</integer>
</dict>
</plist>

Filen heter: com.namn.exempel.plist
Ligger i: /Users/Library/LaunchAgents/com.namn.exempel.plist
...och kör scriptet: /Users/Namn/ShellScripts/mittskript.sh varje timma.

Viktigt med alla program och sökvägar till filer är att man skriver hela sökvägen.
I terminalen kanske man skriver en förkortad variant med "~/foo/bar" osv. Men här, skriv ut hela!

Exempel kommer nedanför...



Resurser:
launchd(8)
launchctl(1)
Mac crontab - Mac OS X startup jobs with crontab, er, launchd
Logging with launchd
Mac launchd and launchctl — the OSX alternative to cron
Cron and launchctl on Mac OS X 10.5 Leopard

Redigerad av iEricF
  • Rösta upp 1

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
xeric

Exempel 1
För att göra 2 enkla exempel - 1 som körs vid uppstart (en gång) och ett som körs varje timme. Mest för att visa exemplen i sin helhet, och om man vill testa lite.

[!] Sökvägar och namn är bara exempel, och måste justeras till dina egna namn/användarnamn osv.

I en textredigerare - gärna ngn bättre än TextEdit, t ex TextWrangler. Först skapar vi 2st s k shellscript.
maint_hourly.sh
maint_startup.sh


Spara dem t ex i en mapp som heter ShellScripts i hemfoldern.

~/ShellScripts/maint_hourly.sh

#!/bin/sh
#
# Underhållsskript som körs varje timma.
#

# Rensa den gömda nerladdningshistoriken
sqlite3 ~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV* 'delete from LSQuarantineEvent';

# Debug/Log
echo " · Hourly: $0 - `date`" >> $HOME/ShellScripts/__debug.txt

I exemplet så rensas listan där Apple sparar allt man laddar ner, även om man tömt sina nerladdningslistor i Safari osv. Brukar finnas en hel del där (som tydligen sparas av ngn märklig anledning).

Den andra lägger till en texrad när skriptet kördes. T ex:
· Hourly: /Users/Namn/ShellScripts/maint_hourly.sh - Tue Nov 12 03:20:42 CET 2013


~/ShellScripts/maint_startup.sh

#!/bin/sh
#
# Underhållsskript som körs varje gång datorn startas upp.
#

# Rensa Drobox Cache'n
rm -rf $HOME/Dropbox/.dropbox.cache/*;

# Säg Hej
say Welcome $USER;

# Debug/Log
echo "[Startup] $0 - `date`" >> $HOME/ShellScripts/__debug.txt

I den här filen töms DropBox cache, säger hej och lägger till en rad i (samma) loggfil:
[startup] /Users/Namn/ShellScripts/maint_startup.sh - Mon Nov 11 20:20:46 CET 2013

För att kunna köra dem måste de ha rättigheter till det. I Terminal kör:

chmod u+x ~/ShellScripts/maint_hourly.sh
chmod u+x ~/ShellScripts/maint_startup.sh

Sen kommer man då till våra "LaunchAgents". Skapa 2 st filer. (Här går det bra med TextEdit).
com.dittnamn.hourly.plist
com.dittnamn.startup.plist


Spara dem i ~/Library/LaunchAgents

~/Library/LaunchAgents/com.dittnamn.hourly.plist

<?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.dittnamn.hourly</string>
	<key>ProgramArguments</key>
	<array>
		<string>/Users/Namn/ShellScripts/maint_hourly.sh</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
	<key>StartInterval</key>
	<integer>3600</integer>
</dict>
</plist>

Nästa...
~/Library/LaunchAgents/com.dittnamn.startup.plist

<?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.dittnamn.startup</string>
	<key>ProgramArguments</key>
	<array>
		<string>/Users/Namn/ShellScripts/maint_startup.sh</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
</dict>
</plist>

Sen laddar man in dem.

launchctl load -w /Users/Namn/Library/LaunchAgents/com.dittnamn.hourly.plist
launchctl load -w /Users/Namn/Library/LaunchAgents/com.dittnamn.startup.plist

Starta man om nu så här man en röst säga välkommen (är med där mest för att kolla så det funkar)
Om man kikar i filen ~ShellScripts/__debug.txt skall det finnas en rad där nu.

Till ett annat exempel om man t e x lägger filen i "/Library/LaunchAgents" så den körs på alla användare, så kan man ju ha lite koll på familjen om/när den loggat in på datorn. Kan ju vara bra till "ungar" som säger att dem gjort skolläxorna hela tiden ... så kan man se om de varit inne på datorn istället. ;)


Ett exempel till
Göra ett eget startup-skript till Safari. Normalt kan man ju få Safari att starta upp vid uppstart och har man angett en startsida så kommer den upp, såklart.

Här är ett exempel jag hittade som just drar nytta av det här med egna skript. Och med lite hjälp av ett "applescript" så kan man öppna Safari med NN sidor som laddas in i flikar, istället för lika många fönster. :)


Först ett litet AppleScript:

on run argv
    tell front window of application "Safari"
        set newTab to make new tab
        set the URL of newTab to item 1 of argv
        set the current tab to newTab
    end tell
end run

Spara i/som: ~/ShellScripts/loadSafari.scpt

Sen shellscriptet som skall köras:

#!/bin/bash
#
# Skript som öppnar {NN} sidor i Safari
#
function saf {
    osascript $HOME/ShellScripts/loadSafari.scpt $1
}
 
# Först ladda en sida (resten laddas efteråt)
open -a Safari "http://forum.macworld.se/"

saf http://www.svd.se/
saf http://www.dn.se/
saf http://www.expressen.se/
saf http://www.aftonbladet.se/

# fyll på med fler ...

Spara i/som: ~/ShellScripts/loadSafari.sh


Och för att göra en "LaunchAgent" till det, så det startas vid uppstart...

<?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.dittnamn.loadSafari</string>
	<key>ProgramArguments</key>
	<array>
		<string>/Users/Namn/ShellScripts/loadSafari.sh</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
</dict>
</plist>

Spara i/som: ~/Library/LaunchAgents/com.dittnamn.loadSafari.plist

Kör i Terminal:

chmod u+x ~/ShellScripts/loadSafari.sh
launchctl load -w ~/Library/LaunchAgents/com.dittnamn.loadSafari.plist

Starta om. info%20(35).gif

 

Skall fixa till färdiga filer/exempel och lägga i en zipfil (kommer sen).

- - -


Sorry, om allt blev väldigt långt. Man får läsa och kolla i portioner. (Det ser mer ut än vad det är). :crossfingers::yeahbaby:

Vill man ha tips/idéer på hur man mer kan skriva/göra, så kolla i OS X egna filer, hur det har gjort och hur de formaterat osv... geek.gif

Redigerad av iEricF
  • Rösta upp 1

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
xeric

Skall fixa till färdiga filer/exempel och lägga i en zipfil (kommer sen).

Färdiga exempel/filer för inlägget ovan. Det står med i textfilerna om var/vilka filer som behöver editeras osv. geek.gif

 

CronLunchdExempel.zip

  • Rösta upp 1

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Alix

Toppeninitiativ, iEricF! Jag har lärt mig massor. :ThumbsUp:

  • Rösta upp 1

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
xeric
[+] Tack! hat.gif Va kul!

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Alix

Jag tänker lägga in det som rensar nedladdningshistorik vid uppstart. :yeahbaby:

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×
×
  • Skapa nytt...