Creare e lanciare all'avvio "servizi di sistema" (Mandriva 2006/2007)

Ven, 02/03/2007 - 12:28

Creare e lanciare all'avvio "servizi di sistema" (Mandriva 2006/2007)

Inviato da Bemipefe 4 commenti

Salve!
Questa guida vi permetterà di capire ancor meglio (spero), il funzionaento di Linux. In particolare sul come si carica un servizio di sistema e come si crea.

Cosa ci serve
Beh praticamente nulla.... se non il sapere cosa vogliamo lanciare all'avvio, un editor di testo. Gradita (ma non indispensabile) la conoscienza del linguaggio Bash.

Che cos'è un servizio di sistema
E' un programma (o meglio un processo del sistema) che viene lanciato al boot, nella fase di caricamento di Linux (o di qualsiasi altro SO). Ci sono servizi che operano e poi "muoiono", e altri che invece sopravvivono per tutta la durata della sessione. In questo caso sono chiamati "Demoni" (ES: l'icona in basso a destra della connessione di rete è "collegata" a un demone che rileva la connessione e la sconnessione del cavo).

Come si carica un servizio
Visto che un servizio è un programma, e nel momento in cui viene eseguito diviene un processo (o programma attivo) del sistema, ebbene questo dovra essere lanciato da init. Dopo la fase di caricamento del kernel (che è la parte di sistema che dialoga con l'hardware) viene lanciato init, che è il primo ad essere lanciato, ed è quello che lancia tutti gli altri processi del SO (si dice infatti che ogni processo è figlio di init che quindi è evidentemente il padre ).

Cosa sono i runlevel
Quando init inizia a lanciare processi, man mano che la Memoria Centrale (RAM) si riempie di processi, avviene il passaggio a livelli successivi. Ogni livello contiene l'insieme di processi, che vengono lanciati in quel livello. Ogni livello ha una certa priorita e importanza.

Dal sito: http://www.coresis.com/extra/linuxcorsobase

Quote:

Runlevel 0 : /etc/rc.d/rc0.d Questo runlevel avvia la sequenza di arresto del sistema (shutdown)
Runlevel 1: /etc/rc.d/rc1.d Questo runlevel rappresenta la modalità singolo utente, nessun altro utente può collegarsi, il servizio di rete è disabilitato.
Runlevel 2: /etc/rc.d/rc2.d Rappresenta lo stato multiutente, il servizio rete è attivo ma è disabilitato il file sharing.
Runlevel 3: /etc/rc.d/rc3.d In genere è quello predefinito quando si opera in modalità testuale, tutti i servizi sono attivi.
Runlevel 4: /etc/rc.d/rc4.d Inutilizzato. Può essere dedicato ad usi personali
Runlevel 5: /etc/rc.d/rc5.d E' il runlevel predefinito quando si vuole avviare Linux in modalità grafica
Runlevel 6: /etc/rc.d/rc6.d Il runlevel 6 è quello di reboot.

Tanto per chiarire le idee, noi andremo ad inserire i nostri servizi, nel runlevel 5. E non nel 6 altrimenti il nostro processo viene lanciato solo nella fase di "rebbot" Laughing

Ma dove sono i servizi del sistema
Sono (almeno su Mandriva) nella cartella /etc/rc.d/init.d raggiungibile anche da /etc/init.d (c'è un link simbolico in "/etc", ossia un collegamento).

Il nostro "runlevel" si trova invece in /etc/rc.d/rc5.d/ oppure (sempre per via del link) in /etc/rc5.d. In questa cartella sono contenuti tuttavia tutti link simbolici. I link (o collegamenti) puntano ai file in /etc/rc.d/init.d e hanno una forma del tipo:

<br />...<br />S95kheader<br />S99drakxtools_http <br />S99local <br />S99wine <br />

Dove la "S" indica che sono dei servizi, il "numero" subito dopo (95, 99...) invece indica la priorita, o meglio l'ordine di lancio dei servizi. Basta comunque dare uno sguardo in /etc/rc5.d perrendere chiare le idee.

Come si crea un servizio
Un servizio è un file bash con una minima struttura. I file bash sono file che contengono comandi shell uno sotto l'altro, e quando viene eseguito un file di questo tipo non si fa altro che eseguire una serie di comandi shell.

Eccone un esempio:
<br />#!/bin/sh<br />#<br /># /etc/init.d/nomefile<br /># Subsystem file for nomefile<br />#<br /># chkconfig: 2345 X 05<br /># description: My made-home service <br />#<br /># processname: nomefile<br /><br /><br />comando1<br />comando2<br />comando3<br /><br />RETVAL=$?<br />exit $RETVAL<br />

Una volta creato un file di testo, con dentro quanto ho postato, accingetevi a modificare la dicitura nomefile con il nome che darete al file. Il nome del file dovra essere SENZA punti ne caratteri particolari, insomma siate il piu semplici possibili. Per la lunghezza del nome non credo ci siano problemi.

La riga:
<br /># chkconfig: 2345 X 05<br />

va modificata mettendo al posto della "X" un numero. Questo numero rappresenta la priorita del servizio. Mentre "05" indica il runlevel.

La riga:
<br /># description: My made-home service<br />

Contiene una semplice descrizione di cio che fa il servizio.Quindi modificate "My made-home service" con quanto piu vi aggrada.

Le righe:
<br />comando1<br />comando2<br />comando3<br />

...3 , 4 , 5 , inserite quanti comandi volete. I comandi che si possono inserire sono quelli della shell bash. Quindi ad esempio: modprobe , ifconfig , mkdir , rm ......etc fino ai banali ls e echo....che non sono molto utili in questo contensto Sad

Le righe:
<br />RETVAL=$?<br />exit $RETVAL<br />

Non le modificate. Servono al sistema, che riceve un valore di ritorno, dall'esecuzione del servizio. Si puo impostare il tutto in modo da ritornare un "FALLITO" (che appare infatti nella scheramta di boot) se il servizio non si avvia correttamente. Tuttavia occorre conoscere bene il bash, e questo non è lo scopo di questa guida.

Dove metto il file "nomefile"
Il file va messo nella cartella /etc/init.d , quindi bisogna avere i privilegi di root per farlo.

Concludendo
In fine bisogna creare un link simbolico dentro il runlevel 5, che punta al nostro "nomefile". Ad esempio supponiamo di avere in /etc/init.d il nostro servizio "nomefile". Andremo a fare:

<br />ln -s /etc/init.d/nomefile /etc/rc5.d/S<b>X</b>nomefile<br />

ATTENZIONE
Nel comando precedente, la "X" va sostituita con un numero del tipo "00" , "01" ....."94" etc... Cosi facendo avrete in /etc/rc5.d il link S00nomefile oppure S01nomefile .......S99nomefile etc....

Infine
Se la procedura è andata a buon fine, e avete screato correttamente il servizio, questo comparirà nella lista dei servizi, visionabile con drakxservices

Buon Divertimento ! Laughing


In:



Commenti

Ritratto di neo571
#1

Inviato da neo571 il Dom, 04/03/2007 - 11:44.

Ottimo Tutorial

Ottima Guida,

Interessante e Utilissima.

Case Cooler Master Cavalier - Enermax Liberty 500W - Intel Core 2 Duo e6420 - 2X1GB Corsair XMS2 675MHz - Asus P5B-E - Asus Geforce 8500GT - WD Caviar 320GB - Mandriva 2007.1 Spring X86_64



Ritratto di kio341
#2

Inviato da kio341 il Dom, 04/03/2007 - 17:35.

Re: Ottimo Tutorial

concordo bella guida!!!
Quote:

Dove la "S" indica che sono dei servizi, il "numero" subito dopo (95, 99...) invece indica la priorita, o meglio l'ordine di lancio dei servizi. Basta comunque dare uno sguardo in /etc/rc5.d perrendere chiare le idee.

qui c'è una piccola imprecisione la "S" indica che il servizio è in Start come K(kill) indica che il servizio è in Stop!!!
vedi da
http://www.debian.org/doc/manuals/reference/reference.it.html
Quote:

2.4.2 I Runlevel

Dopo il completamento del processo di boot, init lancia tutti i servizi configurati per girare nel runlevel predefinito. Questo è definito dalla riga per id in /etc/inittab. Debian arriva con id=2.

Debian usa i seguenti runlevel:

*

1 (modalità singolo utente),
*

2 a 5 (varie modalità multiutente) e
*

0 (arresta il sistema)
*

6 (riavvia il sistema).

I runlevel 7, 8, e 9 possono essere utilizzati, ma le loro directory rc non vengono popolate quando i pacchetti vengono installati.

Scambiate i runlevel mediante il comando telinit.

Quando si entra in un runlevel tutti gli script in /etc/rcrunlevel.d/ vengono eseguiti. La prima lettera del nome determina il modo in cui lo script viene lanciato: quelli che iniziano con K vengono lanciati con l'argomento stop. Quelli che iniziano per S vengono lanciati con l'argomento start. Gli script vengono eseguiti in ordine alfabetico; per cui quelli "stop" vengono lanciati prima di quelli "start" e i numeri a due cifre che seguono K o S determinano l'ordine in cui venono eseguiti.

Gli script in /etc/rcrunlevel.d sono infatti semplici collegamenti simbolici agli script in /etc/init.d/. Essi accettano anche argomenti tipo "restart" e "force-reload"; questi ultimi metodi possono essere utilizzati dopo che un sistema è stato avviato per riavviare i servizi o forzarli a ricaricare i loro file di configurazione.

Per esempio:

# /etc/init.d/exim4 reload



Ritratto di killer1987
#3

Inviato da killer1987 il Sab, 10/03/2007 - 12:38.

Re: Ottimo Tutorial

bella guida... perché non fate un pdf con tutte le guide del sito? sarebbe interessante, no?

Alé Mageia, C'mon Mageia!!! - Wiki Italiano Mandriva - Acer Aspire 5633, intel GMA 950, stamp HP Laserjet 1018, scanner Epson



Ritratto di mapi1968
#4

Inviato da mapi1968 il Lun, 09/07/2007 - 08:16.

Re: Ottimo Tutorial

Un po' di imprecisioni riguardo chkconfig. Se all'interno dello script abbiamo una riga

chkconfig: 2345 55 45

2345 indica i Runlevel di Start
55 il numero di Start
45 il numero di Kill

Concludendo...
è inutile creare i collegamenti se abbiamo configurato correttamente la riga di chkconfig, ci pensa lui:

# chkconfig --add nome_del_servizio

In questo caso verranno creati i collegamenti S55 in Runlevel 2,3,4,5 e K45 in Runlevel 0,1,6

Se il servizio non serve più:

# chkconfig --del nome_del_servizio

http://rpmlinux.org
RSS: http://feedproxy.google.com/rpmlinux/JPTf
Mandriva RPM download repository for 2009.0 2008.1 i586