FreeBSD and Python - Cara Menulis Daemon Script Part 2

· 2 min read

Tanpa mendefinisikan interpreter, sistem init tidak akan mengenali proses ini sebagai proses yang valid. Kemudian kita juga perlu mengarahkannya ke pi

Artikel ini merupakan lanjutan dari artikel sebelumnya tentang cara menulis daemon dengan python di FreeBSD. Pembahasan dalam artikel ini akan membahas Init atau di FreeBSD sering disebut rc.d.


1. Init

Skrip init digunakan untuk mengendalikan daemon (memulai dan menghentikannya, memerintahkannya untuk memuat ulang konfigurasi, dll.). Ada berbagai sistem init yang digunakan dalam sistem operasi mirip Unix. FreeBSD menggunakan sistem init BSD standar yang disebut rc.d. Sistem ini bekerja dengan beberapa skrip shell (atau tidak terlalu sedikit jika Anda perlu mengelola daemon yang sangat kompleks).

Karena sebagian besar fungsi sistem init sama di sebagian besar skrip ini, rc.d menangani semua kasus umum dalam berkas shell-nya sendiri yang kemudian digunakan dalam setiap skrip. Dalam Python, hal ini dapat dilakukan dengan mengimpor modul, istilah skrip shell adalah mencari skrip shell (atau fragmen) lain.

Misalnya, kita akan membuat berkas bernama /usr/local/etc/rc.d/bdaemon dengan konten skrip berikut.

root@ns1:~ # ee /usr/local/etc/rc.d/bdaemon
#!/bin/sh
. /etc/rc.subr

name=bdaemon
rcvar=bdaemon_enable

command="/usr/sbin/daemon"
command_args="-p /var/run/${name}.pid /path/to/script/bdaemon.py"

load_rc_config $name
run_rc_command "$1"

Apa itu rcvar? Nah, dengan memasukkan “bdaemon_enable=YES” ke /etc/rc.conf Anda dapat mengaktifkan daemon ini untuk memulai secara otomatis saat sistem dinyalakan. Jika baris tersebut tidak ada, daemon tidak akan memulai. Itulah sebabnya kita perlu menggunakan "onestart" untuk memulainya (coba tanpa "one" jika Anda belum pernah melakukannya sebelumnya dan lihat apa yang terjadi!).

Kemudian perintah yang akan dieksekusi serta argumen untuk perintah tersebut ditentukan. Dan akhirnya dua fungsi pembantu dari rc.subr dipanggil yang melakukan semua keajaiban rumit yang untungnya disembunyikan dari kita.

Oke, tetapi apa itu /usr/sbin/daemon?. FreeBSD dilengkapi dengan utilitas kecil yang sangat berguna yang menangani proses daemonisasi untuk orang lain. Ini berarti dapat membantu jika kita ingin menggunakan sesuatu sebagai layanan latar belakang tetapi kita tidak ingin menangani daemonisasi yang sebenarnya sendiri.

Argumen “-p” memberi tahu utilitas daemon untuk menangani file PID untuk proses tersebut juga. Hal ini diperlukan agar sistem init dapat mengendalikan daemon. Meskipun program contoh kecil kita berumur pendek, kita masih dapat melakukan sesuatu saat program tersebut berjalan. Cobalah layanan onestatus dan layanan onestop misalnya. Jika tidak ada berkas PID, sistem init akan menyatakan bahwa daemon tidak berjalan, meskipun sebenarnya sedang berjalan, dan sistem init tidak akan dapat menghentikannya.


2. Daemonization dengan Python

Hasil dari bagian 1 adalah sebuah program yang sebenarnya memerlukan bantuan eksternal untuk didaemonisasi. Kita akan mencoba menggunakan utilitas daemon bawaan FreeBSD yang berguna untuk menempatkan program di latar belakang, untuk menangani pidfile. Sekarang kita melangkah maju dan mencoba untuk mencapai hal yang sama hanya dengan menggunakan Python.

Untuk melakukan pekerjaan tersebut, kita memerlukan modul yang bukan bagian dari pustaka standar Python. Jadi, Anda mungkin perlu menginstal paket python-daemon terlebih dahulu. Dalam pembahasan sebelumnya, kita belajar untuk menginstal paket python-daemon di FreeBSD. Baca bagian 1 dari artikel tersebut. Di bawah ini adalah sepotong kecil kode yang dapat diterapkan untuk membuat daemonisasi Python.

root@ns1:~ # ee /tmp/gunungsemeru.py
#!/usr/local/bin/python

# Imports #
import daemon, daemon.pidfile
import logging
import signal
import time

# Fuctions #
def handler_sigterm(signum, frame):
logging.debug("Exiting on SIGTERM")
exit(0)

def main_program():
signal.signal(signal.SIGTERM, handler_sigterm)
try:
logging.basicConfig(filename='/var/log/bdaemon.log', format='%(levelname)s:%(message)s', level=logging.DEBUG)
except:
print("Error: Could not create log file! Exiting...")
exit(1)

logging.info("Started!")
while True:
time.sleep(1)

# Main #
with daemon.DaemonContext(pidfile=daemon.pidfile.TimeoutPIDLockFile("/var/run/bdaemon.pid"), umask=0o002):
main_program()

Dalam contoh skrip di atas, terdapat dua impor baru untuk daemonisasi. Seperti yang dapat dilihat dalam skrip di atas, dimungkinkan untuk mengimpor beberapa modul dalam satu baris. Hal pertama yang lebih menarik dengan versi ini adalah bahwa program utama dipindahkan ke fungsi yang disebut "main_program". Kita dapat melakukannya sebelumnya jika kita benar-benar menginginkannya, tetapi kita akan melakukannya sekarang sehingga kode tersebut tidak mengalihkan perhatian dari poin utama contoh ini. Perhatikan baris yang dimulai dengan kata kunci with . Wah, itu panjang sekali, bukan? Mari kita uraikan menjadi beberapa bagian agar lebih mudah dipahami.


3. Proses Update Init Script

Baiklah, satu-satunya hal yang perlu dilakukan di sini adalah membuat perubahan yang diperlukan pada skrip init. Kita tidak lagi menggunakan utilitas daemon, jadi kita perlu menyesuaikannya. Berikut ini adalah contoh skrip init baru.

root@ns1:~ # ee /usr/local/etc/rc.d/bdaemon
#!/bin/sh

. /etc/rc.subr

name=bdaemon
rcvar=bdaemon_enable

command="/root/bdaemon.py"
command_interpreter=/usr/local/bin/python
pidfile="/var/run/${name}.pid"

load_rc_config $name
run_rc_command "$1"

Pada skrip di atas tidak terlalu banyak perubahan, tetapi mari kita bahas apa yang terjadi. Definisi perintahnya cukup jelas. Program sekarang dapat melakukan daemonisasi pada dirinya sendiri, jadi kita memanggilnya secara langsung. Tidak diperlukan argumen, yang berarti kita dapat menghapus command_args. Namun kita perlu menambahkan command_interpreter, karena program akan terlihat seperti ini dalam daftar proses.

Tanpa mendefinisikan interpreter, sistem init tidak akan mengenali proses ini sebagai proses yang valid. Kemudian kita juga perlu mengarahkannya ke pidfile, karena secara teori mungkin ada beberapa proses yang cocok. Dan itu saja, sekarang kita memiliki proses daemon yang berjalan di FreeBSD, ditulis dalam Python murni.
Subscribe on LinkedIn FreeBSD and Python - Cara Menulis Daemon Script Part 2

Enclosures Link: FreeBSD and Python - Cara Menulis Daemon Script Part 2

Silahkan Berkomentar, Kakak...! Bunda...!

Posting Komentar