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