Sida 1 av 1

Miljövariabelelände [LÖST]

Postat: 28 jan 2008, 21:06
av Patrik64
Jag vet inte om det här är rätt ställe för min fråga men jag visste inte var jag skulle ställa den.
Kan nån reda ut det här med miljövariabler en gång för alla. Jag har förstått så långt att det är i .profile-filen man sätter PATH, CLASSPATH och andra variabler i Ubuntu(det verkar skilja sig åt mellan olika Linuxdistrubutioner). Men i vilken av alla .profile-filer ska man ändra, det finns ju flera stycken. Om man har en användare i systemet så har den en .profile-fil i sin hemkatalog. Sen har root sin .profile-fil och till sist finns en .profile-fil i /etc-mappen.

Nästa sak är hur man skriver, bl.a med export-kommandot. Jag har t.ex skrivit så här:
export PATH=$PATH.:/usr/jdk1.6.0_02/bin
till java installationen. Men jag har även sätt att det kan se ut så här:
export PATH=.:/usr/jdk1.6.0_02/bin:$PATH
eller så här:
PATH=$PATH.:/usr/jdk1.6.0_02/bin
export PATH
Andra varianter är:
export JAVA_HOME=/usr/jdk1.6.0_02
export $JAVA_HOME/bin:${PATH}

I mitt specifika fall handlar det om att komma åt plattformsberoende bibliotek då jag försöker använda JMF performance pack för att få komma åt en webbkamera i ett Javahack som jag håller på med. I det här fallet är det väldigt viktigt enligt specifikationen på sidan http://java.sun.com/products/java-media ... linux.html att alla miljövariabler är på rätt plats och på rätt sätt. Det är det här jag inte får att fungera då det är total oreda i den här miljövariabelfrågan. Jag är nu inte helt säker på om mina problem enbart beror på det här men att det är en del av problemet är jag nästan säker på. Ett felmeddelande kan se ut så här:

java.lang.UnsatisfiedLinkError: /usr/JMF-2.1.1e/lib/libjmv4l.so: libjmutil.so: cannot open shared object file: No such file or directory
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1751)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1647)
at java.lang.Runtime.load0(Runtime.java:770)
at java.lang.System.load(System.java:1005)
at CaptureWebcam.(CaptureWebcam.java:65)
at CaptureWebcam.main(CaptureWebcam.java:161)

Det här tror jag nu beror på att sökvägarna till JMF:en inte fungerar. En sak som indikerar detta är diagnostikappleten på sidan: http://java.sun.com/products/java-media ... stics.html som inte hittar jmf-klasserna om jag inte kopierar in jmf.jar i /java_home/jre/lib/ext mappen, vilket ju inte borde behövas om miljövariablerna är satta på rätt sätt.

Till saken kan sägas att jag har fått webbkameran att fungera i systemet, den går att använda med VLC.

Hoppas någon kan reda ut det här
Patrik

SV: Miljövariabelelände

Postat: 28 jan 2008, 22:06
av mcNisse
PATH variablen styr var skript/binärer hittas. PATH söks från början till slut. Alltså är ordningen viktig.

profile skripten körs enbart när du loggar in. Först körs den /etc sedan din egen, om den finns. Dessutom finns det initfiler för de olika skalen. Dessa körs in varje gång du startar ett nytt skal. Vill du att en inställning ska slå igenom när du startar ett nytt skal kan det vara bättre att ändra i skalets initfil. För bash heter filen .bashrc. Alternativt sourcar du in ~/.profile igen(. ~/.profile)

Vill du ha en utökad kunskap om dessa rekomenderar jag att titta i man-sidorna.

Ditt specifika fel beror med största sannolikhet att du inte har installerat libjmutil.so. Alternativt om du har filen kan du ändra en annan variabel.

Det finns ytterligare en viktig miljövariabel i sammanhanget, ifall du har installerat libbar i en annan katalog än /usr/lib. Kan du exporta LD_LIBRARY_PATH. Den fungerar som PATH men man letar efter libbar att länka in i binärer.

SV: Miljövariabelelände

Postat: 29 jan 2008, 21:32
av Patrik64
Vi får nog gå igenom det här lite till, det är inte helt enkelt speciellt om man inte är rutinerad linuxanvändare. Om vi börjar med att titta på de filer som efterfrågas(libjmv4l.so och libjmutil.so) så finns de i mappen /usr/JMF-2.1.1e/lib. Jag provade att exportera LD_LIBRARY_PATH variabeln och skrev exakt som ovan nämda specifikationssida för jmf:en anger. Jag skrev in den i /etc/profile-filen. Men då gick det inte att logga in i systemet längre. Jag fick felmeddelandet:

Refusing to initialize GTK+
export 27. /usr/JMF-2.1.1e/lib:: bad variable name

Det jag provade sen var att helt enkelt kopiera in *.so filerna i /usr/lib bara för att se om det fungerade och då exekverade mitt javaprogram utan fel. Men jag vill ju egentiligen inte göra på det sättet utan jag vill få mina miljövariabler att fungera som de ska.

Det här med skalens initfil får vi nog gå igenom en gång till. Du säger att när man starar ett nytt skal vilket jag har fått för mig även kan kallas terminal eller konsoll om jag inte är helt ute och cyklar, så får skalet sina egna inställningar för miljövariablerna. Ska jag skriva in miljövariablerna i bashrc i stället för i profile-filerna eller kan de finnas i båda filerna?
Om jag öppnar en terminal och skriver echo $PATH så får jag ut på skärmen ett värde som verkar vara sammansatt från olika profile-filer. Eftersom jag har skrivit samma sökväg för PATH-variabeln i både /etc/profile och /home/anv/.profile så får jag dubbletter av sökvägen i svaret av echo $PATH kommandot. Jag vet inte om det här har skapat förvirring i systemet men som sagt jag är själv förvirrad i den här frågan och har kanske gjort allt helt fel.

Som det kanske märks är det här fortfarande lite snurrit för mig men om jag gör så här att jag ställer ett par raka frågor.

Jag vill få miljövariablerna från jmf:ens specifikationssida korrekt satta i mitt system. På sidan står att de ska se ut så här:

JMFHOME /usr/JMF-2.1.1e
CLASSPATH $JMFHOME/lib/jmf.jar:.:${CLASSPATH}
LD_LIBRARY_PATH $JMFHOME/lib:${LD_LIBRARY_PATH}

I vilken profile-fil ska jag skriva in de i? I både /etc/profile och /home/someuser/.profile eller bara i en av dem? Eller ska de in i .bashrc filen och i så fall var någonstans i den? Hur ska jag göra med LD_LIBRARY_PATH då det som ovan beskrivits blev problem med inloggningen?

SV: Miljövariabelelände

Postat: 29 jan 2008, 22:03
av mcNisse
Var du sätter variabler beror på vilka som ska ha tillgång till inställningarna.
Alla användare: /etc/profile
Bara din användare: ${HOME}/.profile
Du vill ändra ofta och testa nya inställningar ${HOME}/.bashrc. Då behaver du bara skriva exec bash i terminalen.

Standardsättet att exportera variabler (om man bryr sig om portabilitet mellan *nix varianter) görs så här:

JMFHOME=/usr/JMF-2.1.1e
export JMFHOME
CLASSPATH=${JMFHOME}/lib/jmf.jar:.:${CLASSPATH}
export CLASSPATH
LD_LIBRARY_PATH=${JMFHOME}/lib:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH

När du loggar in får du först variabler från /etc/profile och $HOME/.profile. Sedan när du startar ett skal kör init filerna för skalet in. Får du rätt valiabler från /etc/profile behöver du inte sätta om dem i din profile. Är variablerna helt rätt finns det ingen anledning att sätta om dem i skalets rcfiler heller.
I vilken profile-fil ska jag skriva in de i? I både /etc/profile och /home/someuser/.profile eller bara i en av dem? Eller ska de in i .bashrc filen och i så fall var någonstans i den? Hur ska jag göra med LD_LIBRARY_PATH då det som ovan beskrivits blev problem med inloggningen?
Jag skulle inte sätta om någon av dessa filer. Jag skulle skapa ett skript som startar applikationen.

Där du i början exporterar variablerna ovan och sedan anropor det programmet som du normalt sett skulle ha använt.

Kod: Markera allt

#!/bin/bash
JMFHOME=/usr/JMF-2.1.1e
export JMFHOME
CLASSPATH=${JMFHOME}/lib/jmf.jar:.:${CLASSPATH}
export CLASSPATH
LD_LIBRARY_PATH=${JMFHOME}/lib:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH
#anropa ditt program pa nasta rad

Sedan fixar du till exekveringsrättigheter.

Kod: Markera allt

chmod a+x dittSkript
Starta skriptet och se att det fungerar:

Kod: Markera allt

./dittSkript
Slutligen installera skriptet

Kod: Markera allt

sudo mv dittSkript /usr/bin
Om jag inte skulle gå på den här vägen skulle jag stoppa in det i min egen profil.

SV: Miljövariabelelände

Postat: 30 jan 2008, 22:26
av Patrik64
Nu har det äntligen ljusnat i mörkret. Jag la miljövariablerna i /home/anv/.profile utom LD_LIBRARY_PATH för den strulade fortfarande till systemet om den låg där. Jag la den istället i .bashrc och då fungerade allt som förväntat.

Tack för hjälpen.