Linux: Egna script vid uppstart?

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Linux: Egna script vid uppstart?

Inlägg av JimmyAndersson »

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: Markera allt

### 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: Markera allt

#! /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?
Användarvisningsbild
psynoise
EF Sponsor
Inlägg: 7154
Blev medlem: 26 juni 2003, 19:23:36
Ort: Landvetter

Re: Linux: Egna script vid uppstart?

Inlägg av psynoise »

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 .
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Linux: Egna script vid uppstart?

Inlägg av JimmyAndersson »

Aha ... . tror jag.

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

Kod: Markera allt

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.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43148
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Linux: Egna script vid uppstart?

Inlägg av sodjan »

> "rc2_1wire_start.sh" (Blir lagom kul att hitta när man söker efter 1wire-filer.)

*1wire* ?
bos
Inlägg: 2273
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Linux: Egna script vid uppstart?

Inlägg av bos »

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.
Användarvisningsbild
ToB
Inlägg: 678
Blev medlem: 22 februari 2004, 10:32:58
Skype: tobias_bjork
Ort: Sollentuna

Re: Linux: Egna script vid uppstart?

Inlägg av ToB »

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.
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Linux: Egna script vid uppstart?

Inlägg av JimmyAndersson »

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.... :)
danwi
Inlägg: 377
Blev medlem: 16 oktober 2008, 17:00:59
Ort: Linköping

Re: Linux: Egna script vid uppstart?

Inlägg av danwi »

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.
danwi
Inlägg: 377
Blev medlem: 16 oktober 2008, 17:00:59
Ort: Linköping

Re: Linux: Egna script vid uppstart?

Inlägg av danwi »

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å.
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Linux: Egna script vid uppstart?

Inlägg av JimmyAndersson »

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: Markera allt

#! /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. :)
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 14818
Blev medlem: 16 april 2006, 17:04:10

Re: Linux: Egna script vid uppstart?

Inlägg av mrfrenzy »

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: Markera allt

@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.
Nerre
Inlägg: 26654
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Linux: Egna script vid uppstart?

Inlägg av Nerre »

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.
Nerre
Inlägg: 26654
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Linux: Egna script vid uppstart?

Inlägg av Nerre »

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.)
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.
JanErik
Inlägg: 3118
Blev medlem: 11 februari 2008, 17:15:58
Ort: Vasa, Finland

Re: Linux: Egna script vid uppstart?

Inlägg av JanErik »

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.
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Linux: Egna script vid uppstart?

Inlägg av JimmyAndersson »

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: Markera allt

@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. :)
Skriv svar