GNU/Linux >> Linux Esercitazione >  >> Linux

Come scrivere script Init Linux basati su LSB Init Standard

LSB sta per Linux Standard Base.

LSB è stato avviato da Linux Foundation per ridurre la differenza tra diverse distribuzioni Linux e quindi ridurre i costi legati al porting tra diverse distribuzioni. Gli script di inizializzazione sono uno di questi da standardizzare.

In questo articolo vedremo come scrivere uno script Init conforme a LSBInit Standard.

Gli script Init vengono utilizzati per avviare|interrompere un software|servizio. Ad esempio, se stai usando il software postgresql, avremo uno script Init chiamato '/etc/init.d/postgresql' che può essere usato per 'start|stop|restart|reload|force-reload|status'.

Gli script di inizializzazione conformi a LSB devono:

  • Fornire almeno "avvio, arresto, riavvio, ricaricamento forzato e stato"
  • Restituisci il codice di uscita corretto
  • Dipendenze di runtime del documento

Facoltativamente, possono utilizzare funzioni init.d come "log_success_msg", "log_failure_msg" ecc. per registrare i messaggi.

LSB fornisce un insieme predefinito di funzioni che si trova in /lib/lsb/init-functions. Possiamo utilizzare queste funzioni nei nostri script Init. Per impostazione predefinita, tutto il processo Init registrerà il pid del processo in un file nella directory /var/run/. Questo è utile per gli script Init per trovare lo stato del processo.

Ora iniziamo a scrivere uno script Init. Per prima cosa dobbiamo aggiungere un'intestazione allo script Init, che assomiglia a,

### BEGIN INIT INFO
# Provides:          my_daemon
# Required-Start:    postgresql networking
# Required-Stop:     postgresql networking
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: This is a test daemon
# Description:       This is a test daemon
#                    This provides example about how to
#                    write a Init script.
### END INIT INFO

Fornisce specifica qual è la funzione fornita da questo script Init. Il nome dovrebbe essere univoco.

Inizio obbligatorio specifica l'insieme di strutture che devono essere avviate prima di avviare questo servizio. Nel nostro caso, postgresql e networking devono essere avviati prima di avviare my_daemon. Ricorda, qui "postgresql" avrà uno script Init separato che dice "Fornisce:postgresql". Ciò garantisce l'avvio basato sulle dipendenze. Sulla base di questa dipendenza, il comando "inserv" o "update-rc.d" inserirà le voci nelle directory di livello di esecuzione con il numero di sequenza appropriato. Ad esempio, le voci possono essere come segue

/etc/rc2.d/S12postgresql
/etc/rc2.d/S03networking
/etc/rc2.d/S13my_daemon

Ciò indica che la rete verrà avviata prima, quindi postgresql e quindi my_daemon.

Per saperne di più sui livelli di esecuzione, fare riferimento alla fase n. 6 (che è il livello di esecuzione) del processo di avvio di Linux.

Sosta obbligatoria specifica l'elenco delle strutture che devono essere arrestate solo dopo l'arresto di questa struttura. Qui solo dopo l'arresto di my_daemon, le funzionalità di postgresql e di rete verranno interrotte.

Inizio predefinito Interruzione predefinita definisce i livelli di esecuzione in cui il servizio deve essere avviato o interrotto.

Breve descrizione e Descrizione sono utilizzati per fornire una descrizione in merito alla struttura fornita. La descrizione può estendersi su più righe, la descrizione breve è limitata a una singola riga.

Diamo un'occhiata a un vero e proprio script Init.

### BEGIN INIT INFO
# Provides:          my_daemon
# Required-Start:    postgresql networking
# Required-Stop:     postgresql networking
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: This is a test daemon
# Description:       This is a test daemon
#                    This provides example about how to
#                    write a Init script.
### END INIT INFO

# Using the lsb functions to perform the operations.
. /lib/lsb/init-functions
# Process name ( For display )
NAME=my-daemon
# Daemon name, where is the actual executable
DAEMON=/home/user1/my_daemon
# pid file for the daemon
PIDFILE=/var/run/my_daemon.pid

# If the daemon is not there, then exit.
test -x $DAEMON || exit 5

case $1 in
 start)
  # Checked the PID file exists and check the actual status of process
  if [ -e $PIDFILE ]; then
   status_of_proc -p $PIDFILE $DAEMON "$NAME process" && status="0" || status="$?"
   # If the status is SUCCESS then don't need to start again.
   if [ $status = "0" ]; then
    exit # Exit
   fi
  fi
  # Start the daemon.
  log_daemon_msg "Starting the process" "$NAME"
  # Start the daemon with the help of start-stop-daemon
  # Log the message appropriately
  if start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --exec $DAEMON ; then
   log_end_msg 0
  else
   log_end_msg 1
  fi
  ;;
 stop)
  # Stop the daemon.
  if [ -e $PIDFILE ]; then
   status_of_proc -p $PIDFILE $DAEMON "Stoppping the $NAME process" && status="0" || status="$?"
   if [ "$status" = 0 ]; then
    start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE
    /bin/rm -rf $PIDFILE
   fi
  else
   log_daemon_msg "$NAME process is not running"
   log_end_msg 0
  fi
  ;;
 restart)
  # Restart the daemon.
  $0 stop && sleep 2 && $0 start
  ;;
 status)
  # Check the status of the process.
  if [ -e $PIDFILE ]; then
   status_of_proc -p $PIDFILE $DAEMON "$NAME process" && exit 0 || exit $?
  else
   log_daemon_msg "$NAME Process is not running"
   log_end_msg 0
  fi
  ;;
 reload)
  # Reload the process. Basically sending some signal to a daemon to reload
  # it configurations.
  if [ -e $PIDFILE ]; then
   start-stop-daemon --stop --signal USR1 --quiet --pidfile $PIDFILE --name $NAME
   log_success_msg "$NAME process reloaded successfully"
  else
   log_failure_msg "$PIDFILE does not exists"
  fi
  ;;
 *)
  # For invalid arguments, print the usage message.
  echo "Usage: $0 {start|stop|restart|reload|status}"
  exit 2
  ;;
esac

Lo script sopra fornisce fondamentalmente un modello per la scrittura di script LSBInit. Puoi modificare le variabili DAEMON,PIDFILE,NAME e l'intestazione per adattare questo script ai tuoi programmi.

Per saperne di più sulle funzioni fornite da LSB, fare riferimento a Funzioni InitScript

Una volta terminato lo script Init, per avviare o arrestare automaticamente lo script, eseguire il comando seguente. Ciò aggiungerà voci "S" e "K" appropriate nei livelli di esecuzione indicati. Ciò aggiungerà anche il numero di sequenza appropriato considerando le dipendenze.

update-rc.d filename defaults

Linux
  1. Come scrivere file di registro nella RAM usando Log2ram in Linux

  2. Come scrivere testo sull'immagine usando il comando Linux

  3. Come controllare l'utilizzo della memoria in un server basato su Linux

  4. 10 esempi di comandi insserv per gli script di inizializzazione del sistema Linux

  5. Come utilizzare il reindirizzamento dei comandi in Linux

Come analizzare i file CSV negli script Bash in Linux

Script di shell per principianti - Come scrivere script Bash in Linux

Come trovare file basati su timestamp in Linux

Come utilizzare il comando echo negli script Bash in Linux

Come scrivere ed eseguire un programma C in Linux

Come scrivere su una webcam virtuale in Linux?