GNU/Linux >> Belajar Linux >  >> Linux

Cara Menulis Script Init Linux Berdasarkan Standar Init LSB

LSB adalah singkatan dari Linux Standard Base.

LSB dimulai oleh Linux Foundation untuk mengurangi perbedaan antara beberapa distribusi Linux, dan dengan demikian mengurangi biaya yang terlibat dalam porting antara distribusi yang berbeda. Skrip init adalah salah satunya yang harus distandarisasi.

Pada artikel ini, kita akan melihat cara menulis skrip Init yang sesuai dengan Standar LSBInit.

Skrip Init digunakan untuk memulai|menghentikan perangkat lunak|layanan. Misalnya, jika Anda menggunakan perangkat lunak postgresql, kami akan memiliki skrip Init bernama '/etc/init.d/postgresql' yang dapat digunakan untuk 'start|stop|restart|reload|force-reload|status'.

Skrip init yang sesuai dengan LSB harus:

  • Sediakan setidaknya 'mulai, hentikan, mulai ulang, muat ulang paksa, dan status'
  • Kembalikan kode keluar yang benar
  • Ketergantungan run-time dokumen

Secara opsional, mereka dapat menggunakan fungsi init.d seperti “log_success_msg”, “log_failure_msg” dll. untuk mencatat pesan.

LSB menyediakan set fungsi default yang ada di /lib/lsb/init-functions. Kita dapat menggunakan fungsi-fungsi tersebut dalam skrip Init kita. Semua proses Init secara default akan mencatat pid proses dalam file di bawah direktori /var/run/. Ini berguna untuk skrip Init untuk menemukan status proses.

Sekarang mari kita mulai menulis skrip Init. Pertama kita perlu menambahkan header ke skrip Init, yang terlihat seperti,

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

Menyediakan menentukan fasilitas apa yang disediakan oleh skrip Init ini. Nama harus unik.

Diperlukan-mulai menentukan set fasilitas yang harus dimulai sebelum memulai layanan ini. Dalam kasus kami, postgresql dan jaringan harus dimulai sebelum memulai my_daemon. Ingat, di sini 'postgresql' akan memiliki skrip Init terpisah yang mengatakan 'Menyediakan:postgresql'. Ini memastikan boot berbasis ketergantungan. Berdasarkan ketergantungan ini, perintah 'inserv' atau 'update-rc.d' akan menempatkan entri di direktori run-level dengan nomor urut yang sesuai. Misalnya, entri bisa seperti berikut

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

Yang menunjukkan, jaringan akan dimulai terlebih dahulu, lalu postgresql dan kemudian my_daemon.

Untuk mengetahui lebih lanjut tentang run-level, lihat tahap#6 (yang merupakan runlevel) dari proses boot Linux.

Wajib-Berhenti menentukan daftar fasilitas yang harus dihentikan hanya setelah menghentikan fasilitas ini. Di sini hanya setelah my_daemon dihentikan, fasilitas postgresql dan jaringan akan dihentikan.

Default-Start Default-Stop mendefinisikan run-level di mana layanan harus dimulai atau dihentikan.

Deskripsi Singkat dan Deskripsi digunakan untuk memberikan gambaran tentang fasilitas yang disediakan. Deskripsi dapat menjangkau beberapa baris, Deskripsi Singkat terbatas pada satu baris.

Mari kita lihat skrip Init yang sebenarnya.

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

Skrip di atas pada dasarnya menyediakan template untuk menulis skrip LSBInit. Anda dapat mengubah variabel DAEMON,PIDFILE,NAME, dan header untuk membuat skrip ini, sesuai dengan program Anda sendiri.

Untuk mengetahui lebih banyak tentang fungsi yang disediakan oleh LSB, silakan merujuk ke Fungsi InitScript

Setelah skrip Init selesai, untuk membuat skrip mulai atau berhenti secara otomatis, jalankan perintah berikut. Ini akan menambahkan entri 'S' dan 'K' yang sesuai di run-level yang diberikan. Ini juga akan menambahkan nomor urut yang sesuai dengan mempertimbangkan dependensi.

update-rc.d filename defaults

Linux
  1. Cara Menulis File Log Di RAM Menggunakan Log2ram Di Linux

  2. Cara Menulis Teks Pada Gambar menggunakan Perintah Linux

  3. Cara menulis daemon linux dengan .Net Core

  1. 10 Contoh Perintah insserv untuk Script Init Sistem Linux

  2. Cara menggunakan pengalihan perintah di Linux

  3. Bagaimana cara menulis file dengan C di Linux?

  1. Bagaimana cara mengetahui apakah saya menggunakan systemd di Linux?

  2. Bagaimana cara memeriksa suhu drive di Linux?

  3. Bagaimana Linux menangani skrip shell?