Foscamsverige.se Buggfix Plus
Aktuellt datum och tid: 13.11 2014-08-30

Alla tidsangivelser är UTC + 1 timme




Svara på tråd  [ 19 inlägg ]  Gå till sida 1, 2  Nästa
Författare Meddelande
InläggPostat: 14.34 2011-03-31 
Co Admin
Användarvisningsbild

Blev medlem: 20.23 2005-08-06
Inlägg: 24351
Ort: Oskarshamn (En bit utanför)
Jag har ett enkelt litet script som jag vill ska köras när Debian (version 6.0.1a) startas.

Förr kunde man då skriva update-rc.d 1wire_start.sh defaults (där "1wire_start.sh" är namnet på scriptet)
men tydligen har det ändrats. När jag skriver det i terminalen så får jag dessa felmeddelanden:

"update-rc.d: using dependency based boot sequencing
insserv: warning: script 'K011wire_start.sh' missing LSB tags and overrides
insserv: warning: script '1wire_start.sh' missing LSB tags and overrides"


(Jag vet inte varför det blir "K011" istället för "1" i rad 2...)


När jag sökte på felmeddelandet så hittade jag dessa sidor:
http://wiki.debian.org/LSBInitScripts/D ... yBasedBoot
http://wiki.debian.org/LSBInitScripts

Provade därför att lägga till detta högst upp i mitt script:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
### BEGIN INIT INFO
# Provides:          1wire_start.sh
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Startar OWFS vid boot
# Description:       Startar OWFS vid boot och ändrar sökvägen till /mnt/1wire
### END INIT INFO


Men fick samma felmeddelanden som innan.


När jag tittar på andra script i /etc/init.d så står det där inget efter "Required"- och "Default"-raderna.
Provade därför att plocka bort det. Men det blev samma fel ändå.

Hela mitt script för närvarande:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
#! /bin/bash
### BEGIN INIT INFO
# Provides:          1wire_start.sh
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop:
# Short-Description: Startar OWFS vid boot
# Description:       Startar OWFS vid boot och ändrar sökvägen till /mnt/1wire
### END INIT INFO


# Starta OWFS
/opt/owfs/bin/owfs/ -u --allow_other --usb_regulartime /mnt/1wire



Jag har provat att starta om datorn och noterat att scriptet inte körs.
Har även testat att köra sista raden (under "Starta OWFS") i terminalfönstret (dvs 'utanför' scriptet) och det fungerar fint.


Någon som kan guida mig på rätt spår igen?

_________________
Notera att inlägget kan ha expanderat under transporten. Nettovikten är dock låg. Läs bipacksedeln om du har lätt för att få irritation.. . . . . . . (°°)
This message will self-destruct in five seconds.


Upp
 Profil  
 
InläggPostat: 15.00 2011-03-31 
EF Sponsor
Användarvisningsbild

Blev medlem: 18.23 2003-06-26
Inlägg: 6204
Ort: Göteborg / Åhus
Man lägger sitt körbara script i någon av /etc/rc*.d, t.ex /etc/rc5.d för runlevel 5 (X11) eller 4 (multi-user utan X11). Sedan döper man scriptet med lämpliga siffror i början som anger när det ska startas.

EDIT:
Men man brukar inte lägga scripten där direkt utan länka ifrån /etc/init.d .


Upp
 Profil  
 
InläggPostat: 15.53 2011-03-31 
Co Admin
Användarvisningsbild

Blev medlem: 20.23 2005-08-06
Inlägg: 24351
Ort: Oskarshamn (En bit utanför)
Aha ... . tror jag.

Hittade den här sidan där man bl.a kan läsa:

Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
Linux runlevel controls what processes / services are started automatically by the system (or by init to be more exact). The runlevel is a digit from 0 to 6 or the letter S. Runlevels 0, 6 and S are reserved for shutdown, reboot and single user mode respectively. Automation is the keyword here because any of the services can be started later manually at any runlevel.

Debian defines seven runlevels (0-6).

 0 (halt the system)
 1 (single-user / minimal mode),
 2 through 5 (multiuser modes), and
 6 (reboot the system).

Default Debian installation does not make any difference between runlevels 2-5. You may customize them to your liking. Runlevels S (single) and 1 are used for maintenance. They start services minimally to avoid possible problems.



Ok, så då kan jag spara (eller länka) scriptet till någon av 2-5 ?


Mitt script hade tydligen hamnat i flera rc-kataloger:

rc0.d:
K011wire_start.sh

rc1.d:
K011wire_start.sh

rc6.d:
K011wire_start.sh






Hm... Jag ska nog börja om. :)

Raderar filerna i rc*.d-katalogerna. Klart.



Scriptet heter 1wire_start.sh ..men vänta nu.. :

"Sedan döper man scriptet med lämpliga siffror i början som anger när det ska startas."

Är det standard?
"1" där i början antyder ju isåfall att scriptet ska köras som "minimal mode". Dessutom blev ju scriptet omdöpt.. :roll:
Jag vill ju kunna köra det som vanlig användare också. Egentligen oavsett hur många användare det finns..

Ändra "1wire" till "onewire" vore inget roligt alternativ. Kort sagt: Det gör jag inte.

Ok, alternativ då:
"rc2_1wire_start.sh" (Blir lagom kul att hitta när man söker efter 1wire-filer.)
"1wire_start_rc5.sh" (Hyfsat, men det ser rörigt och förvirrande ut.)
Ytterligare ett alternativ är att låta filen heta det den gör, men då får man leta efter den i rätt rc*-katalog...


Gah, jag ville bara låta scriptet köras när Debian startas..

Men själva principen är alltså:

ln /etc/init.d/scriptnamn.sh /etc/rc2/scriptnamn.sh

om jag förstått rätt?

Eller:

ln /etc/init.d/2scriptnamn.sh /etc/rc2/scriptnamn.sh

...eller nåt.

_________________
Notera att inlägget kan ha expanderat under transporten. Nettovikten är dock låg. Läs bipacksedeln om du har lätt för att få irritation.. . . . . . . (°°)
This message will self-destruct in five seconds.


Upp
 Profil  
 
InläggPostat: 15.58 2011-03-31 
EF Sponsor
Användarvisningsbild

Blev medlem: 15.29 2005-05-10
Inlägg: 30806
Ort: Söderköping
> "rc2_1wire_start.sh" (Blir lagom kul att hitta när man söker efter 1wire-filer.)

*1wire* ?

_________________
Inga PM tack. Skicka mail...


Upp
 Profil  
 
InläggPostat: 16.55 2011-03-31 

Blev medlem: 23.29 2007-02-24
Inlägg: 1785
Ort: Vänersborg
JimmyAndersson skrev:
Aha ... . tror jag.

Skit i alla stenjobbiga runlevels (rcX.d), lägg in ett anrop till ditt script i /etc/rc.d/rc.local bara så blir allt frid och fröjd.

_________________
http://www.ribit.se/ - plockar ut data från havererade hårddiskar.


Upp
 Profil  
 
InläggPostat: 17.09 2011-03-31 
Användarvisningsbild

Blev medlem: 10.32 2004-02-22
Inlägg: 678
Ort: Sollentuna
JimmyAndersson skrev:
"Sedan döper man scriptet med lämpliga siffror i början som anger när det ska startas."

Är det standard?
"1" där i början antyder ju isåfall att scriptet ska köras som "minimal mode".


Vilken av katalogerna avgör väl i vilken runlevel scriptet ska köras och i varje katalog körs filerna i "bokstavsordning".
På så sätt kan man se till att saker som är beroende av varandra laddas i rätt ordning.


Upp
 Profil  
 
InläggPostat: 19.04 2011-03-31 
Co Admin
Användarvisningsbild

Blev medlem: 20.23 2005-08-06
Inlägg: 24351
Ort: Oskarshamn (En bit utanför)
Inte så dumt egentligen. Det är bara jag som tycker själva metoden (specifika tecken i början av filerna) är lite onödigt rörigt gjort.

T.ex om man kikar i /etc/rc0.d så ser man filer som heter bl.a:
K01urandom
K02avahi-daemon
K03sendsigs
K04rsyslog

Men man vänjer sig väl. :)
Varför just "K" i början på alla filer?

Är det möjligen "K01", "K02" osv som Psynoise syftade på med:
"Sedan döper man scriptet med lämpliga siffror i början som anger när det ska startas." ?


Sodjan:
"*1wire* ?"

Precis, det verkar vara ett måste.


Bos:
"Skit i alla stenjobbiga runlevels (rcX.d), lägg in ett anrop till ditt script i /etc/rc.d/rc.local bara så blir allt frid och fröjd."

Jag har ingen katalog som heter "rc.d" i /etc/
Såhär ser det ut:

/etc/rc0.d
/etc/rc1.d
/etc/rc2.d
/etc/rc3.d
/etc/rc4.d
/etc/rc5.d
/etc/rc6.d
/etc/rc.local <-- en fil
/etc/rcS.d

Filer:
/etc/init.d/rc
/etc/init.d/rc.local
/etc/init.d/rcS

Om jag då vill att ett script ska köras oavsett runlevel, var ska jag spara (eller skriva anrop till) filen då?



edit:

Måste ändå fråga för att ge det här med runlevels en chans, rent teoretiskt iallafall:

Tänker högt:
1) Scriptet "1wire_start.sh" ska vara i /etc/init.d
2) För att göra en 'länk' till rätt /etc/rcX.d-katalog så gör jag:
ln /etc/init.d/1wire_start.sh /etc/rc2/K10_1wire_start.sh

Men....
Här avbryter jag listan pga ett gäng frågetecken:

A) Körs scripten i rc2.d , rc3.d osv i turordning? Dvs filerna i rc2.d före filerna i rc5.d ?

B) Vad döper jag scriptet till om jag vill att mitt script ska köras när alla andra script körts?
"Z01_1wire_start.sh" kanske? för att få utrymme med 98 framtida script innan Z99.. För det kanske är max?

C) "Z01_1wire_script.sc" säger inget om vilken rcX.d-mapp filen ligger i,
så man kanske ska döpa filen till t.ex "Z01_rc2_1wire_start.sh" om den ska ligga i /etc/rc2.d ?


Snacka om att förvirra fienden.... :)

_________________
Notera att inlägget kan ha expanderat under transporten. Nettovikten är dock låg. Läs bipacksedeln om du har lätt för att få irritation.. . . . . . . (°°)
This message will self-destruct in five seconds.


Upp
 Profil  
 
InläggPostat: 19.39 2011-03-31 

Blev medlem: 16.00 2008-10-16
Inlägg: 208
Ort: Linköping
Blandade svar på blandade frågor:
* Man lägger normalt sett startup-scriptet i /etc/init.d, scriptet heter lämpligtvis nåt bra som "onewire". För enkelhets skull så rekommenderar jag att du utgår från ett script som redan finns och ändrar för att få till det du vill åstadkomma.
* I /etc/init.d/rcX.d (X=0..6) lägger man sedan symlänkar till scriptet. Symlänkarna heter KYYscriptnamn resp SYYscriptnamn, YY är två siffror som beskriver ordningen som scripten anropas i. I ditt fall rekommenderar jag att dom heter S99onewire och K01onewire.
* Scripten ska minst stödja kommandona start, stop och status (kommandon ges som argument till scriptet).
* Scripten i rcX.d-katalogerna anropas "automagiskt" av systemet då man byter runlevel. När man går till en runlevel så körs alla S-script (s=start), när man lämnar den körs alla K-script (k=kill).
* Vill man att scriptet ska köras oavsett runlevel så lägger man helt enkelt länkar i alla rcX.d-kataloger.

Runlevels motsvarar olika "driftlägen" i systemet. Runlevel 1 är normalt sett "Single-User Mode", runlevel 3 är "Multi-User Mode with Networking" och 5 är "Graphical Multi-User Mode with Networking". Dom övriga är bland annat för uppstart (0) och avstängning (6). Normal runlevel är antingen 3 eller 5 i normala system. 3 är om man inte kör grafiskt användargränsnitt, annars är det 5 som gäller.

_________________
"Varför köpa något färdigt när man kan bygga det själv för dubbla kostnaden?"


Upp
 Profil  
 
InläggPostat: 19.46 2011-03-31 

Blev medlem: 16.00 2008-10-16
Inlägg: 208
Ort: Linköping
Just ja, vill man "fuska" kan man lägga in ett anrop i rc.local. Det scriptet körs också i samband med uppstarten så det funkar "i princip". Nackdelarna är flera, här kommer några:
* Det körs först vilket innebär att olika tjänster som kanske egentligen behövs inte har startats.
* Det finns ingen motsvarighet för snygg avstängning (motsvarande K-scripten).
* Debian använder inte (eller har i alla fall inte använt) rc.local på samma sätt som andra distributioner... Exakt vad/hur som skiljer mot andra distros är jag osäker på.

_________________
"Varför köpa något färdigt när man kan bygga det själv för dubbla kostnaden?"


Upp
 Profil  
 
InläggPostat: 23.46 2011-03-31 
Co Admin
Användarvisningsbild

Blev medlem: 20.23 2005-08-06
Inlägg: 24351
Ort: Oskarshamn (En bit utanför)
Det var mycket intressanta och givande svar. Tack! :tumupp: :)
Faktiskt så tror jag det rätade ut alla mina tidigare frågetecken.

Däremot funderar jag på det här med scriptet.
Vad som står efter "Required-Start" och "Required-Stop" är olika från script till script,
så det är lite svårt att ändra ett befintligt...

Jag har hittat denna förklaring:

"$local_fs : all local filesystems are mounted. All scripts that write in /var/ need to depend on this, unless they already depend on $remote_fs.

$remote_fs : all filesystems are mounted. In some LSB run-time environments, filesystems such as /usr may be remote. If the script need a mounted /usr/, it needs to depend on $remote_fs. Scripts depending on $remote_fs do not need to depend on $local_fs. During shutdown, scripts that need to run before sendsigs kills all processes should depend on $remote_fs."



Men jag har aldrig haft något behov av det för att starta OWFS, så i mina ögon kvittar det vad jag väljer...

Samma sak med stödjet för kommandona "start", "stop" och "status":

Scriptet ska startas när det körs och behöver inte avslutas förrän man avslutar eller startar om datorn.
Det räcker att man kör scriptet, så jag hänger inte med på varför man först ska starta scriptet och sedan
starta det som står i scriptet med något speciellt kommando...




Men jag gör ett försök med mitt script:
(Har kommit på ett annat namn på scriptet. :) )


Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
#! /bin/bash

### BEGIN INIT INFO
# Provides:      owfs-kontroll
# Required-Start:   $remote_fs      <--- ?
# Required-Stop:   $remote_fs      <--- ?
# Default-Start:   5
# Default-Stop:   6
# Short-Description:   OWFS-kontroll
# Description:   Startar/Avslutar OWFS vid boot och ställer in sökvägen till /mnt/1wire
### END INIT INFO


case "$1" in
   start)
      #Startar OWFS (äntligen det som jag egentligen skulle göra)
      /opt/owfs/bin/owfs/ -u --allow_other --usb_regulartime /mnt/1wire
      ;;
  stop)
      #Avslutar OWFS
      killall owfs
      ;;
   *)
      echo "Usage: $N {start|stop}" >&2
      exit 1
      ;;
esac
exit 0


Hur man gör med "status" vet jag inte riktigt...


Scriptet sparar jag som /etc/init.d/owfs-kontroll.sh

Sedan länkar till rc5 och rc6:
ln /etc/init.d/owfs-kontroll.sh /etc/rc5/S99_owfs-kontroll.sh
ln /etc/init.d/owfs-kontroll.sh /etc/rc6/K01_owfs-kontroll.sh


Jag har inte provat än, men om jag har tänkt rätt så har jag förstått. :)

_________________
Notera att inlägget kan ha expanderat under transporten. Nettovikten är dock låg. Läs bipacksedeln om du har lätt för att få irritation.. . . . . . . (°°)
This message will self-destruct in five seconds.


Upp
 Profil  
 
InläggPostat: 23.54 2011-03-31 
Co Admin
Användarvisningsbild

Blev medlem: 16.04 2006-04-16
Inlägg: 5973
Kul att du lär dig skriva moderna initscript, det kan säkert bli användbart i framtiden.
Det är bäst att sköta länkningen med update-rc.d, som du märkte i början på tråden så har den också viss felhantering och man undviker på så sätt att skapa en loop som förhindrar att systemet bootar.

Om man bara behöver funktionen att starta owfs vid boot så är det betydligt enklare att skriva "crontab -e" och lägga in följande rad:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
@reboot /opt/owfs/bin/owfs/ -u --allow_other --usb_regulartime /mnt/1wire


Kärnan kommer ju iaf att döda owfs när den väl haltar systemet.


Upp
 Profil  
 
InläggPostat: 07.43 2011-04-01 

Blev medlem: 06.51 2008-05-19
Inlägg: 13147
Ort: Upplands väsby
danwi skrev:
* I /etc/init.d/rcX.d (X=0..6) lägger man sedan symlänkar till scriptet. Symlänkarna heter KYYscriptnamn resp SYYscriptnamn, YY är två siffror som beskriver ordningen som scripten anropas i. I ditt fall rekommenderar jag att dom heter S99onewire och K01onewire.


I Debian-baserade system så gör man INTE detta manuellt, utan det sköts med update-rc.d. Lägger man in dem manuellt är det som gjort för missar och slarvfel som ger konstiga fel.


Upp
 Profil  
 
InläggPostat: 07.56 2011-04-01 

Blev medlem: 06.51 2008-05-19
Inlägg: 13147
Ort: Upplands väsby
JimmyAndersson skrev:
Vad som står efter "Required-Start" och "Required-Stop" är olika från script till script,
så det är lite svårt att ändra ett befintligt...


De där sakerna som står i kommentarerna i början av scriptet används av update-rc.d när den skapar de olika start- och stopp-länkarna. Den behöver ju veta i vilken ordning olika saker skall startas.

Här står lite mer förklarat om bakgrunden
http://wiki.debian.org/LSBInitScripts/D ... yBasedBoot

(Kan även rekommendera http://wiki.debian.org/LSBInitScripts)

Ubuntu har numera gått över till upstart, som är helt event-baserat. (Och jag gillar det inte eftersom man istället för "/etc/init.d/script start" ska skriva "start script". Med SysV-init (d.v.s. /etc/init.d) så kunde man använda TAB completion för att få rätt namn på scriptet, men det funkar inte med upstart...)

Det här med S och K handlar om vad som händer när man byter runlevel. (S=start, K=kill, har jag för mig)

Ska du gå från runlevel 3 till 4 så körs (i princip) först alla K-script under rc3.d och sen alla S-script under rc4.d. (Fast om det körs ett S-script för en viss grej i rc4.d så körs inte K-scriptet i rc3.d, det är ju meningslöst att först stoppa en grej för att sen starta den igen.)

Citera:
Scriptet ska startas när det körs och behöver inte avslutas förrän man avslutar eller startar om datorn.
Det räcker att man kör scriptet, så jag hänger inte med på varför man först ska starta scriptet och sedan
starta det som står i scriptet med något speciellt kommando...


Att stänga ner datorn är detsamma som att gå till runlevel 0. Saker måste (oftast) stängas av i rätt ordning.

Vad jag förstått snurrar ditt script i bakgrunden? Då bör du använda start-stop-daemon för att starta och stoppa det. Den håller reda på PID för scriptet och kan döda rätt process och se till att det inte körs dubletter.


Upp
 Profil  
 
InläggPostat: 14.11 2011-04-01 

Blev medlem: 17.15 2008-02-11
Inlägg: 1124
Ort: Vasa, Finland
I Gentoo kan man också sätta kommandon i /etc/conf.d/local, både för start och stopp. Finns också /etc/conf.d/local.start och /etc/conf.d/local.stop men jag tror de är deprecated. Men Gentoo har lite annorlunda runlevels än Debianfamiljen.


Upp
 Profil  
 
InläggPostat: 15.25 2011-04-01 
Co Admin
Användarvisningsbild

Blev medlem: 20.23 2005-08-06
Inlägg: 24351
Ort: Oskarshamn (En bit utanför)
Nerre:
"Vad jag förstått snurrar ditt script i bakgrunden?"

Nope, det är bara en "one-timer", dvs ett script som gör lite småsaker *en* gång när man startar (eller just startat, det kvittar) Debian.
Kort sagt så kör det igång OWFS (1Wire-filsystem) och monterar det som ett virtuellt filsystem under /mnt/1wire.

MrFrenzy's förslag räcker gott till detta. Dvs:
Kod: [Expandera/Minimera] [Hämta] (Untitled.txt)
@reboot /opt/owfs/bin/owfs/ -u --allow_other --usb_regulartime /mnt/1wire


Att jag inte tänkte på det själv är nog för att jag tidigare använt just update-rc.d 1wire_start.sh defaults
när jag satt upp 1wire-burkar. :)

Det var ett tag sedan jag satte upp en Debian-burk, så det här med runlevels var helt nytt för mig,
men nu förstår jag varför jag fick felen i trådens första inlägg. :tumupp:

Jag har även lärt mig hur smidigt det är med start/stop-daemon, så det kommer jag helt klart använda till framtida script.


Måste bara passa på att fråga om två saker i scriptet i mitt förra inlägg:

1) Hur fungerar "$remote_fs" och "$local_fs" egentligen? Jag förstår inte förklaringen jag citerade i mitt förra inlägg.
2) I scriptet står det case "$1". Vad är "$1" för något? (Svara inte bara 'en variabel' om det nu är det. Jag vill veta lite mer om det. :) )


edit: Lade just in ett crontab-job och startade om. Fungerar fint. :)

_________________
Notera att inlägget kan ha expanderat under transporten. Nettovikten är dock låg. Läs bipacksedeln om du har lätt för att få irritation.. . . . . . . (°°)
This message will self-destruct in five seconds.


Upp
 Profil  
 
Visa inlägg nyare än:  Sortera efter  
Svara på tråd  [ 19 inlägg ]  Gå till sida 1, 2  Nästa

Alla tidsangivelser är UTC + 1 timme


Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 1 gäst


Du kan inte skapa nya trådar i denna kategori
Du kan inte svara på trådar i denna kategori
Du kan inte redigera dina inlägg i denna kategori
Du kan inte ta bort dina inlägg i denna kategori
Du kan inte bifoga filer i denna kategori

Sök efter:
Hoppa till:  
    3dverkstan
Drivs av phpBB® Forum Software © phpBB Group
Swedish translation by Peetra & phpBB Sweden © 2006-2010