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