GNU/Linux >> Znalost Linux >  >> Linux

Jak psát Linux Init Scripts založené na LSB Init Standard

LSB je zkratka pro Linux Standard Base.

LSB založila Linux Foundation, aby snížila rozdíl mezi několika distribucemi Linuxu, a tím snížila náklady spojené s portováním mezi různými distribucemi. Init skripty jsou jedny z nich, které je třeba standardizovat.

V tomto článku uvidíme, jak napsat iniciační skript, který odpovídá standardu LSBInit.

Skripty init se používají ke spuštění|zastavení softwaru|služby. Pokud například používáte software postgresql, budeme mít inicializační skript s názvem '/etc/init.d/postgresql', který lze použít k 'start|stop|restart|reload|force-reload|status'.

Init skripty kompatibilní s LSB musí:

  • Poskytněte alespoň „start, stop, restart, force-reload a status“
  • Vraťte správný výstupní kód
  • Závislosti běhu dokumentu

Volitelně mohou k protokolování zpráv použít funkce init.d jako „log_success_msg“, „log_failure_msg“ atd.

LSB poskytuje výchozí sadu funkcí, která je v /lib/lsb/init-functions. Tyto funkce můžeme využít v našich inicializačních skriptech. Všechny procesy Init ve výchozím nastavení zaznamenají pid procesu do souboru v adresáři /var/run/. To je užitečné pro inicializační skripty k nalezení stavu procesu.

Nyní začneme psát skript Init. Nejprve musíme do skriptu Init přidat záhlaví, které vypadá takto,

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

Poskytuje určuje, jaká je funkce poskytovaná tímto skriptem Init. Název by měl být jedinečný.

Povinné spuštění specifikuje sadu zařízení, která by měla být spuštěna před spuštěním této služby. V našem případě musí být před spuštěním my_daemon spuštěn postgresql a networking. Pamatujte, že zde „postgresql“ bude mít samostatný skript Init, který říká „Provides:postgresql“. To zajišťuje bootování založené na závislosti. Na základě této závislosti příkaz „inserv“ nebo „update-rc.d“ umístí položky do adresářů na úrovni běhu s příslušným pořadovým číslem. Záznamy mohou být například následující

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

Což znamená, že nejprve bude spuštěno vytváření sítí, poté postgresql a poté my_daemon.

Chcete-li se dozvědět více o úrovních běhu, podívejte se na fázi č. 6 (což je úroveň běhu) procesu spouštění Linuxu.

Povinné zastavení specifikuje seznam zařízení, která musí být zastavena až po zastavení tohoto zařízení. Zde pouze po zastavení my_daemon budou zastaveny postgresql a síťová zařízení.

Výchozí spuštění Výchozí zastavení definuje úrovně běhu, ve kterých musí být služba spuštěna nebo zastavena.

Krátký popis a Popis se používají k poskytnutí určitého popisu s ohledem na poskytované zařízení. Popis může zahrnovat více řádků, krátký popis je omezen na jeden řádek.

Podívejme se na skutečný Init skript.

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

Výše uvedený skript v podstatě poskytuje šablonu pro psaní skriptů LSBInit. Můžete změnit proměnné DAEMON,PIDFILE,NAME a hlavičku, aby se tento skript přizpůsobil vašim vlastním programům.

Chcete-li se dozvědět více o funkcích poskytovaných LSB, viz Funkce InitScript

Po dokončení inicializačního skriptu proveďte následující příkaz, aby se skript automaticky spustil nebo zastavil. Tím se do daných úrovní běhu přidají příslušné položky „S“ a „K“. Tím také přidáte příslušné pořadové číslo s ohledem na závislosti.

update-rc.d filename defaults

Linux
  1. Jak napsat linuxového démona s .Net Core

  2. Jak zjistit, zda používám systemd na Linuxu?

  3. Jak zkontrolovat teplotu disku v systému Linux?

  1. Jak zapisovat soubory protokolu do RAM pomocí Log2ram v Linuxu

  2. Jak napsat text na obrázek pomocí příkazu Linux

  3. Jak se Linux vypořádává se skripty shellu?

  1. Jak zkontrolovat využití paměti na serveru se systémem Linux

  2. 10 příkladů příkazů insserv pro inicializační skripty systému Linux

  3. Jak používat přesměrování příkazů pod Linuxem