Starta ett program med fördröjning – KUbuntu 14.10

Jag stötte idag på ett problem där jag behövde starta ett program efter några sekunder, och letade på nätet efter hur man kan göra och självklart hittar man lösningen. Denna gång utan allt för mycket svårigheter. I det här fallet skulle jag starta en ljudspår efter 10 sekunder.

Eftersom jag inte tror att det finns en lösning i grafiskt läge, utan jag behöver en lösning i terminal, så visade det sig att problemet bestod av två delar. Exemplet nedan visar hur jag använder upplägget. Fungerar även utan parentes, vet inte vad dessa gör.

(echo "sleep"; sleep 10 ; echo "playing") | play sound.mp3

Del ett – program att spela ljudfiler

Del ett var att hitta ett program som kunde spela upp en ljudfil, det blev programmet ”play” som finns i paketet ”sox”. Dessutom visade det sig att jag behövde lägga till stöd för mp3.

sudo apt-get install sox libsox-fmt-all

Jag hade säkert inte behövt installera libsox-fmt-all, när det i det här fallet bara var mp3-stödet som behövdes.

Del två – skapa fördröjning

Del två var att skapa en fördröjning innan play skulle köras igång. Ett enkelt sätt var att använda kommandot ”sleep”. För 10 sekunders fördröjning skriver visas i exemplet nedan.

sleep 10

Nu trodde jag att det var att bara pipe:a (|) ihop dessa två lösningar, men se det gick inte. Play körde igång direkt utan fördröjning. Så jag var tvungen att hitta ytterligare en lösning på ett problem. Det visar sig att man måste klä ”sleep” med någon typ av output. Och svaret ser ni i början där jag lagt till detta. Den första ”echo” kommer att skrivas ut, men verkar inte behövas egentligen för att få ”sleep” att fungera som tänkt. Den andra ”echo” skrivs inte ut vad jag kunnat se. Verkar vara så att den andra ”echo” skickas som input till programmet efter pipe-tecknet.

Om du inte läste rubriken så kör jag KUbuntu 14.10 när detta skrivs.

Länkar

Första två länkarna har med uppgiften att göra, övriga tre länkar har med pipe att göra.

http://linux.die.net/man/1/play
http://stackoverflow.com/questions/15491222/bash-timed-piping

http://man7.org/linux/man-pages/man2/pipe.2.htmlhttp://www.linfo.org/pipes.html
http://stackoverflow.com/questions/1072125/how-does-piping-work-in-linux

Uppgradering till KUbuntu 14.10 ger problem med ljudet

Efter uppgradering till 14.10 från 14.04 av KUbuntu får jag problem med att ljudet hackar. Det är som att det är någon buffring som ställer till med något problem. Jag gissar att det är en nyare version av Pulsaudio som ställer till med detta.

Jag provar två saker, först att ändra i /etc/pulse/daemon.conf och sedan tar jag bort alla gamla inställningar för min användare.

Uppdatering – 2015-02-07

De ändringar jag beskriver nedan slutade rätt snart att fungera, och jag har sedan dess grubblat och letat på nätet efter någon lösning. Till slut gick jag in i volymkontrollen för pulseaudio och ändrade under ”Playback” från ”Simultaneous output …” till vanliga ”Built in analog stereo” och därefter tillbaka till ”Simultaneous output …”. Efter detta fungerade ljudet som det ska. Jag hoppas att det kan hålla i sig.

Alternativ ett, ändra i demonen

Steg ett att ändra i /etc/pulse/daemon.conf mot slutet av denna fil kan man hitta en rad som säger:

default-fragment-size-msec = 10
ändras till
default-fragment-size-msec = 5

Jag kommenterade så klart den gamla koden och skrev en kommentar för framtida påminnelse. Därefter startade jag om pulseaudio med.

pulseaudio -k

Detta hade bara en marginell betydelse. Det blev bättre, men inte så bra som det var innan jag uppgraderade.

Alternativ två, radera gamla inställningar

Detta visade sig vara rätt medicin. Jag började med att skapa en mapp för det jag skulle ta bort. Detta händer från min användares hemma-mapp så klart:

cd ~
mkdir pulse-tmp
mv .pulse* pulse-tmp/

Avslutar med att stänga ned alla instanser av pulseaudio med:

killall pulseaudio

Efter detta fungerade mitt ljud lika bra som tidigare. Kommer ej ihåg var jag hittade dessa tips. Om jag hittar dem kommer jag att uppdatera så klart.

Wine ger error när jag kör ett gammalt DOS-program i Ubuntu

Jag har ett föråldrat Windowsprogram för att göra bokföring till en förening som jag varit med i för länge sedan. Det är ett 16-bitars program, så det borde egentligen bytas ut till något mer modernt. Jag provade att köra igång det för att se om det var möjligt att flytta över den informationen till något modernare, men jag kunde inte köra igång programmet för jag fick ett fel.

err:module:attach_process_dlls "krnl386.exe16" failed to initialize, aborting

Så jag letade lite på nätet, och hittade.

https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1327532

Där beskriver Loic Minier att man kan skriva

sudo sysctl abi.ldt16=1

för att lösa problemet. Jag provade, och det fungerade.

Kan även passa på att lägga till handlingarna att så länge som det saknas blanktecken i sökvägen till exe-filen så behövs inga dubbel-fnuttar runt sökvägen. Annars är det att rekommendera, för då fungerar det alltid.

Shorewall brandvägg två LAN och en ISP

Före jul tänkte jag att nu måste jag göra vad jag länge har funderat på, att köpa mig utrustning för att ha trådlös uppkoppling hemma. Gjorde slag i saken och köpte en superbillig router för 99 kr från CDON.

En av de orsaker som gjort att jag inte skaffat mig denna utrustning tidigare, har varit osäkerhet i hur jag vill sätta upp den nya lösningen. Jag har bestämt mig för att köra två separata LAN där det trådlösa nätet inte kommer att ha någon kontakt med mitt normala lokala nät. För tillfället har jag inget som helst behov av att låta mina trådlösa enheter komma i kontakt med mina enheter på det fasta nätet.

Schematisk bild av nätverk med två LAN och en ISP.
En schematisk bild av hur mitt nätverk kan se ut hemma. Två LAN och en anslutning till ISP.

Vilka verktyg har jag då haft till mitt förfogande?

  • Debian
  • Shorewall
  • Tre nätverkskort – ett nytt från tidigare

1 – Installera nätverkskortet

Steg ett är att hitta ett nätverkskort som jag kan installera, och jag hade ett som låg och skräpade i ett hörn. Tänker inte beskriva det något närmare, det finns gott om beskrivningar om hur man gör på nätet.

2 – Konfigurera nätverkskortet

Steg två är att se till att det konfigureras rätt. Det kan hända att de existerande nätverkskorten byter ordning när man sätter in ett nytt. Detta är något som var vanligt i alla fall i äldre distributioner. Jag konfigurerar alltid mina nätverkskort statiskt, och det gör jag i Debian i filen

/etc/network/interfaces

Återigen tänker jag inte bråka om hur man gör det. Kanske jag lägger med en länk här om jag hittar någon som känns bra.

3 – Konfiguration av Shorewall, den svårare delen

Steg tre är att se till att sätta upp Shorewall så att den gör rätt, detta tog mig mer än vecka innan jag kom på vad jag hade gjort för fel. Det kanske inte var så många timmar effektiv tid, för jag hade annat att göra också.För att testa om saker fungerar så brukar jag tillåta Ping, även om det finns många som stänger av detta för att höja säkerheten. Jag resonerar för närvarande så att, om jag blir attackerad och det kan lösas genom att stänga av Ping så gör jag det när det behövs. Det är enklare för mig att använda Ping som test-verktyg, i alla fall om jag konfigurerar rätt.

Nu hade jag ställt in att Ping skulle tillåtas mot det nya nätverket, men på fel sätt. Detta var den primära anledningen till att det tog sådan tid. När jag fixade detta så löste jag resterande funktion på mindre än en timme.

För att masquerading (masq) ska fungera så måste man göra rätt inställningar i/etc/shorewall/masqOm ditt externa nätverkskort heter ”eth0” och det interna nätverkskortet heter ”eth2” och ”eth2” använder 10-nätet så ser raden som man ska lägga till som följer

eth0        10.0.0.0/8

detta är för att nätverkspaketen ska veta till vilket LAN de ska till när de kommer tillbaka till burken och ska transporteras vidare. Självklart finns det en notering för mitt normala lokala nätverk som kopplar mot eth1.

Även /etc/shorewall/interfaces måste ha nya rader, jag kallade mitt nya nät för ”wifi” då den skulle användas för det

wifi        eth2

Självklart behövs det några rader i

/etc/shorewall/rules

Dessa låter jag er fundera över själva. Det är egentligen samma som när man ställer in vad som ska vara öppet mot resten av mina nät.

Loggning från ett bash-script

Jag kom att tänka på att loggning till syslog skulle vara bra när man skriver egna script, så jag har lagt till stöd för detta i mitt script för att göra backup. Jag kommer inte här att visa den delen av scriptet, utan jag visar hur man gör med loggningen.

Detta körs på Ubuntu, men borde fungera även på andra distar.

Jag har använt programmet ”logger” som installeras med paketet ”bsdutils”.

sudo apt-get install bsdutils

Skriver du i bash

~$ logger Test

så kommer det att visas i /var/log/syslog som

<date-and-time>  <computer-name> <user>: Test

Kan man då visa variabler i den text som logger skickar till syslog? Ja-visst kan man det.

#!/bin/sh
VAR1="BLABLA"
logger "Test of variable: VAR1 = $VAR1"

Detta lilla script kommer då att se ut något som följer i syslog

<date-and-time>  <computer-name> <user>: Test of variable: VAR1 = BLABLA

Självklart ska man inte skriva ”~$” för det är prompten i bash som ibland ser ut så.

Versioner

~$ logger --version
logger from util-linux 2.20.1

~$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

Länkar

  1. Sökning med orden ”logging to syslog linux from bash”
  2. http://www.cyberciti.biz/tips/howto-linux-unix-write-to-syslog.html