در ابونتو سرویس زمپ به طور خودکار استارت نمی شود بنابراین برای اجرای آن لازم است که هر بار به صورت دستی با استفاده از کامند زیر آن را استارت کرد.

sudo /opt/lampp/lampp start$

حال اگر از آن زیاد استفاده می کنید جالب نیست که هر بار آن را استارت کرد بنابراین در این مقاله قصد داریم چگونگی استارت شدن اتوماتیک آن را آموزش دهیم برای این کار لازم است که یک اسکریپت (init script) بسازید.

برای ساخت اسکریپت لازم است که یک فایل به اسم lampp در مسیر etc/init.d بساید یا که ترمینال را باز کنید و کامند زیر را اجرا نمایید:

sudo gedit /etc/init.d/lampp$

این کامند یک اسکریپ با نام lamp در مسیر/etc/init.d می سازد.

قبل از اینکه فایل باز شود system prompts رمز ورود را مطابق شکل زیر از ما می پرسد. بعد از وارد کردن رمز فایل اسکریپ (init script) مورد نظر باز می شود حال باید خطوط زیر را در این فایل اضافه کنیم.

#!/bin/bash
### BEGIN INIT INFO
# Provides: lampp
# Required-Start: $local_fs $syslog $remote_fs dbus
# Required-Stop: $local_fs $syslog $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start lampp
### END INIT INFO
/opt/lampp/lampp start


توضیح کد init script:

#!/bin/bash

این خط به سیستم عامل دستور می دهد که شل مورد نظر (bash) را برای اجرای کامندهای زیر آن فراخوانی کند.

شل (shell) در لینوکس:

برای اجرا شدن یک دستور در سیستم عامل ها ابتدا باید دستور مورد نظر به زبان صفر و یک تبدیل شود تا برای هسته ی سیستم عامل قابل درک باشد و پس از آن این دستور توسط هسته پردازش و در نهایت اجرا شود. پس برای برقراری ارتباط ما با هسته ی سیستم عامل به یک واسط نیاز داریم تا دستوری را که توسط کاربر ایجاد شده است را دریافت و آنرا به زبانی قابل فهم برای هسته ترجمه کند این واسط همان شل است
به عبارت دقیق تر شل ها برنامه هایی هستند که دستورات متنی قابل فهم برای بشر را دریافت و آنها را به زبان کرنل ترجمه می کنند تا بتواند آنها را تحلیل و پردازش کند. بصورت پیش فرض لینوکس ها از شلی به نام بش (bash) استفاده می کنند.


برنامه های کاربردی ممکن یک یا چند اسکریپت را نصب کنند بنابراین برای اکتیو کردن init scripts لازم است که یک کامند install_initd فراخوانی شود و برای حذف کردن آن نیز لازم است که یک کامند remove_initd فراخوانی شود این عملیات با رمز گشایی خط های یک بلاک با فرمت خاص در اسکریپت تعیین می شوند که این خط ها در اسکریپت بین دو خط زیر قرار می گیرند.

### BEGIN INIT INFO
### END INIT INFO

همه خط های در این بلاک با کاراکتر # شروع می شوند بنابراین شل با آنها به صورت یک کامنت رفتار می کند و بر اجرای اسکریپت اثری ندارند.
فرمت همه ی خط ها باید به صورت زیر باشد.


# {keyword}: arg1 [arg2...]

که keyword و آرگومانهایی آنها در زیر شزح داده می شوند

Provides: boot_facility_1 [boot_facility_2...]
# Provides: lampp

Boot facility: برای اینکه وابستگی ها را در شروع مقدار دهی اولیه یک اسکریپت نشان دهند استفاده می شوند

در این خط باید از نام اسکریپ یا نام سرویس به عنوان Boot facility استفاده کنیم و این نام برای جلوگیری از از ارر duplicate provides در هنگام نصب بسته، باید یونیک باشد.

Required-Start: boot_facility_1 [boot_facility_2...]
# Required-Start: $local_fs $syslog $remote_fs dbus

در این خطfacility هایی که باید در زمان شروع اسکریپت در دسترس باشند را نشان می دهد. سیستم init-script باید مطمین باشد که init-script هایی که به وسیله ی Required-Start facilities مهیا میشوند قبل از شروع این اسکریپت استارت هستند. اگر هیچ facility نوشته نشود بدین منظور است که اسکریپت بعد از bootstrap بدون بررسی هیچ فایل سیستمی می تواند شروع شود. در این خط به facility های زیر نیاز است :
$local_fs: همه ی فایل سیستم های لوکال را بررسی می کند.
$syslog: لاک های سیستم رو ثبت می کند
$remote_fs:‌ همه ی فایل سیستم های ریموت را بررسی میکند . در بعضی از تنظیمات فایل سیستم هایی مانند /usr ممکن است ریموت باشند بسیاری از برنامه هایی که به $local_fs نیاز دارند به احتمال زیاد به $remote_fs هم نیاز دارند

Required-Stop: boot_facility_1 [boot_facility_2...]
# Required-Stop: $local_fs $syslog $remote_fs

در این خطfacility هایی که باید در زمان متوقف کردن اسکریپت در دسترس باشند را نشان می دهد و سیستم init-script باید تا زمانی که این اسکریپت متوقف نشده از متوقف شدن init script هایی که توسط Required-Stop مهیا شدند جلوگیری کند.

Default-Start: run_level_1 [run_level_2...], Default-Stop: run_level_1 [run_level_2...]
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6

سطوح اجرا باید به طور دیفالت init script را با یک آرگومان start (stop) برای start (stop) سرویس ها ( کنترل شده به وسیله ی init script) اجرا کنند.
به طور مثال اگر سرویسی باید در سطوح اجرای ۳ و ۴ و ۵ اجرا شود
"Default-Start: 3 4 5" و "Default-Stop: 0 1 2 6" مشوند، که در آن هر کدام از این اعداد به صورت زیر میباشند و برای install_initd لازم اند.


0 halt ((Shuts down the system)
1 single user mode (The system boots into superuser mode without starting daemons or networking. Ideal for booting into a recovery or diagnostics environment.)
2 multiuser with no network services exported (will start some non-essential services. This may, or may not contain networking depending on your Linux distribution)
3 normal/full multiuser
4 reserved for local use, default is normal/full multiuser
5 multiuser with a display manager or equivalent (is when GUI desktops are loaded such as Gnome or KDE.)
6 reboot ( the operating system will reboot when runlevel 6 is issued.)

Short-Description: short_description
# Short-Description: Start lampp

توضیح خلاصه ای در رابطه با اتفاقی که قرار است در این init script اتفاق افتد را بیان می کند.

/opt/lampp/lampp start

در این خط هم مسیر سرویسی که قرار است استارت شود نوشته می شود که این خط توسط شل اجرا می شود.

تا زمانی که اجازه ی اجرا به این فایل ندهیم با آن به عنوان یک فایل معمولی برخورد می شود برای اینکه اجازه ی اجرا به این فایل را بدهید لازم است که خطوط زیر را در ترمینال اجرا کنید.


$ls –l /etc/init.d/lampp
$sudo chmod +x /etc/init.d/lampp
$ls –l /etc/init.d/lampp

اولین کامند ویژگی های فایل جاری را لیست می کند.

دومین کامند اجازه ی اجرا شدن به بقیه ی ویژگی های این فایل اضافه می کند.

سومین کامند بررسی می کند که ویزگی اجرا شده به این فایل اضافه شده است یا خیر.

حال لازم است که به ابونتو دستور بدهیم که اسکریپتی که نوشته ایم را در default runlevels چک کند که این کار با دستور زیر قابل انجام است.


$sudo update-rc.d lampp defaults

با update-rc.d می توان سرویس ها را به استارتاپ اضافه یا از آن حذف کرد. سیستم عامل لینوکس چندین سطح اجرا دارد که در بالا به آن ها اشاره شده، و می توان سرویس ها را مشخص کرد که در کدام سطح اجرا شود.

برای تست با استفاده از کامند زیر سیستم را ریستارت کنید.

$reboot

سپس با نوشتن url زیر در بروزر استارت شدن زمپ را بررسی کنید:

http://localhost

توجه: برای ابونتوهای قبل از 16.04 تنها کافی است که در اسکریپ خطوط زیر را بنویسید:

#!/bin/bash
/opt/lampp/lampp start

منابع:

https://www.computernetworkingnotes.com/ubuntu-linux-tutorials/how-to-start-xampp-automatically-in-ubuntu-linux.html

http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/initscrcomconv.html

http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/runlevels.html

http://refspecs.linuxbase.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/facilname.html

https://www.howtogeek.com/119340/htg-explains-what-runlevels-are-on-linux-and-how-to-use-them/