GNU/Linux >> Tutoriels Linux >  >> Linux

Comment écrire des scripts d'initialisation Linux basés sur la norme d'initialisation LSB

LSB signifie Linux Standard Base.

LSB a été lancé par Linux Foundation pour réduire la différence entre plusieurs distributions Linux, et ainsi réduire le coût impliqué dans le portage entre différentes distributions. Les scripts d'initialisation sont l'un d'entre eux à standardiser.

Dans cet article, nous verrons comment écrire un script d'initialisation conforme au standard LSBInit.

Les scripts d'initialisation sont utilisés pour démarrer|arrêter un logiciel|service. Par exemple, si vous utilisez un logiciel postgresql, nous aurons un script Init nommé '/etc/init.d/postgresql' qui peut être utilisé pour 'start|stop|restart|reload|force-reload|status'.

Les scripts d'initialisation conformes au LSB doivent :

  • Fournir au moins "démarrer, arrêter, redémarrer, recharger de force et état"
  • Renvoyer le code de sortie approprié
  • Documenter les dépendances d'exécution

En option, ils peuvent utiliser des fonctions init.d comme "log_success_msg", "log_failure_msg" etc. pour enregistrer les messages.

LSB fournit un ensemble de fonctions par défaut qui se trouve dans /lib/lsb/init-functions. Nous pouvons utiliser ces fonctions dans nos scripts Init. Tous les processus Init enregistreront par défaut le pid du processus dans un fichier sous le répertoire /var/run/. Ceci est utile pour les scripts Init pour trouver l'état du processus.

Commençons maintenant à écrire un script Init. Nous devons d'abord ajouter un en-tête au script Init, qui ressemble à,

### 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

Fournit spécifie quelle est la fonction fournie par ce script Init. Le nom doit être unique.

Démarrage requis spécifie l'ensemble d'installations qui doivent être démarrées avant de démarrer ce service. Dans notre cas, postgresql et le réseau doivent être démarrés avant de démarrer my_daemon. N'oubliez pas qu'ici 'postgresql' aura un script Init séparé qui dit 'Provides:postgresql'. Cela garantit un démarrage basé sur les dépendances. Sur la base de cette dépendance, la commande 'inserv' ou 'update-rc.d' placera les entrées dans les répertoires de niveau d'exécution avec le numéro de séquence approprié. Par exemple, les entrées peuvent être comme suit

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

Ce qui indique que la mise en réseau sera démarrée en premier, puis postgresql et enfin my_daemon.

Pour en savoir plus sur les niveaux d'exécution, reportez-vous à l'étape 6 (qui correspond au niveau d'exécution) du processus de démarrage Linux.

Arrêt requis spécifie la liste des installations qui doivent être arrêtées uniquement après l'arrêt de cette installation. Ici, seulement après l'arrêt de my_daemon, les fonctionnalités de postgresql et de mise en réseau seront arrêtées.

Démarrage par défaut Arrêt par défaut définit les niveaux d'exécution dans lesquels le service doit être démarré ou arrêté.

Description courte et Description sont utilisés pour donner une description en ce qui concerne l'installation fournie. La description peut s'étendre sur plusieurs lignes, la description courte est limitée à une seule ligne.

Regardons un vrai 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

Le script ci-dessus fournit essentiellement un modèle pour écrire des scripts LSBInit. Vous pouvez modifier les variables DAEMON, PIDFILE, NAME et l'en-tête pour adapter ce script à vos propres programmes.

Pour en savoir plus sur les fonctions fournies par le LSB, veuillez vous référer à Fonctions InitScript

Une fois le script Init terminé, afin que le script démarre ou s'arrête automatiquement, exécutez la commande suivante. Cela ajoutera les entrées "S" et "K" appropriées dans les niveaux d'exécution donnés. Cela ajoutera également le numéro de séquence approprié en tenant compte des dépendances.

update-rc.d filename defaults

Linux
  1. Comment écrire des fichiers journaux dans la RAM à l'aide de Log2ram sous Linux

  2. Comment écrire du texte sur une image à l'aide de la commande Linux

  3. Comment vérifier l'utilisation de la mémoire sur un serveur basé sur Linux

  4. Comment écrire un fichier avec C sous Linux ?

  5. Comment écrire un démon Linux avec .Net Core

Comment analyser les fichiers CSV dans les scripts Bash sous Linux

Shell Scripting pour les débutants - Comment écrire des scripts Bash sous Linux

Comment trouver des fichiers basés sur l'horodatage sous Linux

Comment utiliser la commande echo dans les scripts Bash sous Linux

Comment écrire et exécuter un programme C sous Linux

Comment écrire sur une webcam virtuelle sous Linux ?