notify-send
notify-send är ett litet, enkelt och fantastiskt användbart program för att skicka meddelanden från terminalen till skrivbordets system för underrättelser (notifications). Det spelar ingen roll vilken skrivbordsmiljö du använder, och det är inte heller något du behöver ange; notify-send tar hand om det åt dig. Däremot skiljer sig det förstås lite i utseende mellan underrättelser i de olika miljöerna. För närvarande använder jag skrivbordsmiljön Gnome 3 där underrättelserna dyker upp i nedre skärmkanten och ser ut så här:
Använder du Ubuntu dyker underrättelserna upp i det övre högra hörnet, använder du KDE i det nedre högra. I program utvecklade för skrivbordsmiljö är det vanligt att underrättelser används för att berätta om status och förändringar i systemet eller i program du kör. Ett vanligt exempel är t.ex. en underrättelse om att en nedladdning är klar. Arbetar man både i terminal och i skrivbordsmiljö är det dock knepigt att ha koll på när långdragna processer och skript kör klart på något annat vis än att öppna upp terminalen och själv se efter. Med notify-send löser vi det problemet genom att från vårt skript skicka ett meddelande till vår skrivbordsmiljö. Du kan alltså lugnt sitta och surfa medan exempelvis rsync kör och få ett meddelande när det är klart.
Kommandot för ovanstående underrättelse är inte svårare än så här:
notify-send -t 10000 "Underrättelse" "Ser ut så här!"
Växeln -t använder vi för att ange hur länge underrättelsen ska visas (i millisekunder), i vår fall alltså 10 sekunder. Nästa parameter är rubriken följt av själva meddelandet. Nedan tänkte jag visa två exempel på hur notify-send kan användas i praktiken.
Lyckokakor med notify-send!
Det första exemplet är kanske roligare än vad det är nyttigt. Fortune är ett riktigt klassiskt program för terminalen vars enda uppgift är att skriva ut ett meddelande likt det som finns i lyckokakor (fortune cookies) till terminalen. Meddelandena är ganska varierade, från aforismer till citat och skämt, de flesta med en ganska ”nördig” betoning. För att använda fortune installerar du paketet fortune-mod och skriver sedan bara fortune för att få en lyckokaka:
[anders@anders-laptop ~]$ fortune Never do today what you can put off until tomorrow.
Visdomsord indeed! Många använder fortune för att visa ett ”lycko”-meddelande till användare då de loggar in, exempelvis över SSH. Vad vi vill göra här är samma sak fast i form av en underrättelse i skrivborsmiljö. För att skicka meddelandet från fortune anger vi det som en parameter till notify-send:
notify-send -t 10000 "Lyckokaka" "`fortune`"
Kommandot är i princip identiskt med det vi skrev tidigare. Det enda vi bytt ut är meddelandet som nu istället för en egen text visar resultatet av kommandot fortune. Detta åstadkommer vi genom att sätta kommandot fortune innanför `-tecken (tecknet kallas ”grav accent” på svenska) vilket signalerar till bash att texten innanför ska ersättas med programmets utskrift och inte texten ”fortune”. Som en sista touch på det hela byter vi ut den tråkiga ikonen med glödlampan till något lämpligare. Jag hittade den här bilden på en lyckokaka. Att ange vilken ikon som ska användas gör vi med växeln -i:
notify-send -t 10000 -i "/home/anders/fc.png" "Fortune Cookie" "`fortune`"
Jag bytte också ut texten ”Lyckokaka” till ”Fortune Cookie” då alla meddelanden ändå är på engelska och jag föredrar att inte blanda språk. Det sista jag gör nu är att lägga in ovanstående kommando bland skrivbordsmiljöns uppstartsprogram. I Gnome gör vi det grafiskt med programmet gnome-session-properties men varierar förstås mellan olika skrivbordsmiljöer. Varje gång vi startar om datorn eller loggar in i min skrivborsmiljö får vi nu en lyckokaka i form av en underrättelse!
Underrättelser från Apaches loggfil
Ett smart användningsområde för notify-send kan vara att bevaka en loggfil och rapportera ändringar och fel som underrättelser på skrivbordet. Det ”klassiska” sättet att bevaka en loggfil brukar från terminalen vara med kommandot tail och växeln -f (follow) som printar ut de sista 10 raderna ur en fil och uppdateras allteftersom filen fylls med nya rader. Ägnar vi oss åt exempelvis webbutveckling i skrivbordsmiljö kan det dock vara tidsödande att ständigt växla mellan terminalen och skrivbordet för att kontrollera om Apaches loggfil visar några fel. Ett sätt att slippa det kan vara att skicka ändringarna som tail -f registrerar till notify-send för att få dem som underrättelser istället.
För att kunna bevaka Apaches loggfil behöver vi antingen ha root-access eller ändra behörigheten på loggfilen så att den kan läsas av en vanlig användare. I en produktionsmiljö, alltså en webbserver som ligger online är det förstås idioti att låta vilken användare som helst få tillgång till loggfilerna. Här är det dock bara en lokal utvecklingsmiljö vi använder oss av, och gissningsvis är webbserverloggarna på min laptop inte av något större intresse ens om någon utomstående fick tillgång till den! I en ”skarp” miljö används ju dessutom sällan en skrivbordsmiljö på servern, vilket sålunda betyder att dessa instruktioner bara är av användning för utveckling på egen dator! Nåväl, vi börjar därför med att ändra behörighetskraven för katalogen med Apaches loggfiler:
sudo chown -R anders /var/log/httpd/
Ovanstående ändrar ägare för katalogen /var/log/httpd inklusive filer däri från användaren root till användaren anders, alltså min användare. Kontrollera att du kan läsa filen /var/log/httpd/error_log genom att skriva ”tail /var/log/httpd/error_log” utan att använda sudo. Fungerar det kan vi nu fortsätta med vårt kommando som i sin helhet kommer se ut så här:
tail -n0 -f /var/log/httpd/error_log | while read line; do \ notify-send -t 10000 "Apache error_log:" "$line"; done
Vi inleder alltså med att anropa programmet tail med växeln -f för att följa vad som händer i filen /var/log/httpd/error_log. Vad som är nytt här är växeln -n0. -n-växeln anger hur många rader från filen som som ska visas i terminalen. I vårt fall vill vi inte ha några rader alls i terminalen då vi ju istället vill skicka meddelanden till notify-send, således -n0. Vi låter sedan en loop kontinuerligt läsa av de förändringar som tail rapporterar och spara dessa i variabeln line. Denna variabel anges sedan som meddelande i kommandot notify-send. Programmet kommer alltså att köra tills det avbryts av användaren och lämpar sig därför att köras i en bakgrundsprocess.
Även detta kommandot lägger jag till i gnome-session-properties för att starta processen varje gång jag loggar in i min skrivbordsmiljö. Uppstår det nu något fel i Apache medan jag sitter och utvecklar och testar webbsidor och php-skript kommer det direkt upp en underrättelse om detta:



