วันนี้จะมาพูดถึงการจัดการ service ของระบบ ubuntu ประมาณว่าการสั่งให้
service start หรือ stop ตอนเปิดปิดเครื่องเป็นต้น
ก่อนอื่นเราต้องเข้าใจขั้นตอนการเรียก service ของ linux
ซะก่อนนะครับว่ามันมีขั้นตอนยังไงบ้าง
เท่าที่ผมรู้(ไม่ชัวว์ 100%)
linux จะเรียก script service ตามระดับเรียกว่า runlevel ซึ่งมีอยู่หลักๆ
0-6 ซึ่งอยู่ใน /etc/rc0.d/ ถึง /etc/rc6.d/ ถ้าว่าแต่ runlevel คืออะไร
ตารางที่ 1 แสดง run lvel และคำอธิบาย
| Run Level | คำอธิบาย |
| 0 | Halt - ใช้หยุดการทำงานของระบบ |
| 1 | Single user - จะโหลด configuration น้อยที่สุด เพื่อให้ใช้งานได้คนเดียวเท่านั้น |
| 2 | ไม่ได้ใช้งาน |
| 3 | Multiuser |
| 4 | ไม่ได้ใช้งาน |
| 5 | X Window - เป็นกราฟฟิกโหมด |
| 6 | Reboot - ใช้รีบูตระบบ |
| S หรือ s | ถูกใช้งานโดยสคริปต์ที่รันใน level 1 |
| a, b, c | เป็น run level พิเศษ ซึ่งปกติไม่ได้ใช้งาน |
ที่ต้องสนใจเป็นพิเศษก็น่าจะ 0 1 6
0 ก็คือตอน shutdown
1 ก็ตอนเปิดเครื่อง
6 ตอนรีสตาร์ท
ซึ่งการทำงานลำดับของระบบตอนทำงานขึ้นมามีดังนี้
- -ตั้งค่าตัวแปร $PATH
- -configure networking
- -ตั้งค่า clock
- -โหลดค่า keyboard configuration, system font
- -เริ่มการทำงานของส่วน swap
- -เริ่มการทำงานส่วน USB controller
- -ตรวจสอบ root filesystem ว่าต้องการการซ่อมแซมหรือไม่
- -ทำการ remount root filesystem ใหม่ให้เป็นแบบ read-write
- -ตรวจสอบ filesystem ว่าต้องการการซ่อมแซมหรือไม่
- -เริ่มการทำงานของอุปกรณ์ plug and play
- -เคลียร์ /etc/mtab (mounted filesystem table)
- -เพิ่มค่า root filesystem ในไฟล์ /etc/mtab
- -เริ่มต้นการทำ hard drive optimization
- -เริ่มต้นการเซ็ตโควต้าของ user , group สำหรับ root filesystem
- -ตั้งค่า hostname
- -เตรียมพร้อมสำหรับการโหลดโมดูลต่างๆ
- -ค้นหาโมดูลที่จำเป็นในการโหลด
- -โหลดโมดูล sound
- -เพิ่มอุปกรณ์ RAID และทำการ mount filesystem อื่นๆ
- -เคลียร์ไฟล์ /etc/mtab, /etc/fastboot, /etc/nologin
- -ลบล็อกไฟล์ของ UUCP
- -ลบ stale subsystem files
- -ลบ stale pid files
- -เริ่มการทำงานของ serial port
- -ตั้งค่าของ SCSI tape (ถ้ามี)
จากนั้นลินุกซ์จะทำการรันสคริปต์ภายใต้โฟลเดอร์ /etc/rc.d/rc ตามด้วย option คือ level ที่ระบุ ดัง configuration ใน /etc/inittab
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
เช่นเมื่อถูกสั่งให้รันใน run level 3 สคริปต์ rc จะทำการตรวจสอบว่าไดเรกทอรี /etc/rc.d/rc3.d มีไฟล์อยู่หรือไม่ หากมีอยู่ก็จะทำงานโดย จะรันสคริปต์ที่อยู่ภายใต้/etc/rc.d/rc3.d/ และมีชื่อไฟล์ขึ้นต้นด้วยตัวอักษร S (uppercase) โดยจะส่งคำสั่งไปยังสคริปต์ดังกล่าวด้วยออปชัน start
ซึ่งผู้ใช้สามารถเปลี่ยนลำดับการทำงานก่อนหลังได้โดย เปลี่ยนค่าตัวเลขที่อยู่หลังตัวอักษร S หรือ K เช่น ไฟล์ S85httpd จะถูกสั่งให้ทำงานก่อนไฟล์ S90mysql ซึ่งหากต้องการให้ mysql ถูก start ก่อนก็สามารถเปลี่ยนชื่อไฟล์จาก S90mysql เป็นตัวเลขอื่นที่น้อยกว่า 85 และไม่ซ้ำกับไฟล์อื่นที่มีอยู่ในไดเรกทอรีเดียวกัน
จากนั้น init จะทำการรันไฟล์ /etc/rc.local ซึ่งถูกรันเมื่อระบบถูกบูตหรือรันใน
run level 2,3 หรือ 5 โดยปกติมักจะใช้เพื่อใส่คำสั่งที่ต้องการให้ทำงานในการบูตแต่ละครั้ง
และท้ายสุดก็จะรันสคริปต์ในไฟล์ /etc/rc.serial โดยปกติแล้วจะรันเมื่อสิ้นสุดกระบวนการใน
run level 1 หรือ 3 เพื่อทำหน้าที่เริ่มต้นการทำงานของ serial port
เอาเป็นว่ารู้คร่าวๆว่ามันจะทำงาน ตามลำดับ โดย 0 6 จะทำงานตอนระบบจะปิดและรีสตาร์ทตามลำดับแล้วกัน
คราวนี้เรามาดูว่าจะทำการั่งให้ service รัน ตามในช่วงที่เราต้องการได้ยังไง
เอา service apache เป็นหนูทดลองละกัน
เวลาเราจะสั่งให้ apache ทำงานเราจะต้องเขียนแบบนี้
# /etc/init.d/apache2 start
ดูว่า apache ทำงานอยู่ใน runlevel ใหนยังไงบ้าง
# ls -l /etc/rc?.d/*apache2
lrwxrwxrwx 1 root root 17 2007-07-05 22:51 /etc/rc0.d/K91apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 2007-07-05 22:51 /etc/rc1.d/K91apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 2007-07-05 22:51 /etc/rc2.d/S91apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 2007-07-05 22:51 /etc/rc3.d/S91apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 2007-07-05 22:51 /etc/rc4.d/S91apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 2007-07-05 22:51 /etc/rc5.d/S91apache2 -> ../init.d/apache2
lrwxrwxrwx 1 root root 17 2007-07-05 22:51 /etc/rc6.d/K91apache2 -> ../init.d/apache2
ถ้าดูจะเห็นว่า runlevel 0 , 1 ,6 จะเริ่มด้วยตัวอักษร K แล้วตามด้วยตัวเลขลำดับแล้วตามด้วยชื่อ service
ส่วน runlevel 2 3 4 5 จะเป็นตัว S ซึ่งตัวอักษรนี้ย่อมาจาก Kill และ Start ของระบบ Debian และ Ubuntu นั้นเอง
เราจะทำอะไรกับ service ได้บ้าง
1. Removing a Service
ถ้าคุณต้องการยกเลิก service apache ด้วยตัวเองคุณจะต้องทำการลบ link ที่อยู่ใน /etc/rcX.d/ ทุกอัน หรือใช้คำสั่ง
update-rc.d ซึ่งงายกว่าดังนี้
# update-rc.d -f apache2 remove
2. Adding a service
2.1. Default priorities
ถ้าคุณต้องการเพิ่มให้ service start ขึ้นมาตอนที่เครื่องบูต แค่ใช้คำสั่งง่ายๆคือ update-rc.d apache2 defaults
# update-rc.d apache2 defaults
Adding system startup for /etc/init.d/apache2 ...
/etc/rc0.d/K20apache2 -> ../init.d/apache2
/etc/rc1.d/K20apache2 -> ../init.d/apache2
/etc/rc6.d/K20apache2 -> ../init.d/apache2
/etc/rc2.d/S20apache2 -> ../init.d/apache2
/etc/rc3.d/S20apache2 -> ../init.d/apache2
/etc/rc4.d/S20apache2 -> ../init.d/apache2
/etc/rc5.d/S20apache2 -> ../init.d/apache2
2.2. Custom priorities
จาก ที่เห็นค่า defaults จะเป็น 20 ซึ่งมันแต่ต่างจาก 91 โดยลำดับ S20 จะทำงานก่อน S91 และเช่นเดียวกัน K20 จะทำงานก่อน K91 ถ้าเราต้องการให้ apache Start และ Kill ในลำดับที่ 91 เราสามารถสั่งคำสั่งได้ดังนี้
# update-rc.d apache2 defaults 91
Adding system startup for /etc/init.d/apache2 ...
/etc/rc0.d/K91apache2 -> ../init.d/apache2
/etc/rc1.d/K91apache2 -> ../init.d/apache2
/etc/rc6.d/K91apache2 -> ../init.d/apache2
/etc/rc2.d/S91apache2 -> ../init.d/apache2
/etc/rc3.d/S91apache2 -> ../init.d/apache2
/etc/rc4.d/S91apache2 -> ../init.d/apache2
/etc/rc5.d/S91apache2 -> ../init.d/apache2
2.3. Different priorities for Start and Kill
หาว่าเราต้องการให้ลำดับการ Start และ Kill ต่างกัน เช่น ต้องการให้ Start ลำดับที่ 20 และต้องการให้ Kill ลำดับที่ 80
เราสามารถสั่งคำสั่งได้ง่ายๆ
# update-rc.d apache2 defaults 20 80
Adding system startup for /etc/init.d/apache2 ...
/etc/rc0.d/K80apache2 -> ../init.d/apache2
/etc/rc1.d/K80apache2 -> ../init.d/apache2
/etc/rc6.d/K80apache2 -> ../init.d/apache2
/etc/rc2.d/S20apache2 -> ../init.d/apache2
/etc/rc3.d/S20apache2 -> ../init.d/apache2
/etc/rc4.d/S20apache2 -> ../init.d/apache2
/etc/rc5.d/S20apache2 -> ../init.d/apache2
3. Specifying custom runlevels
หากว่าเราต้องการกำหนดเองทั้งหมดว่าที่ runlevel ไหนให้ทำงานลำดับที่เท่าไหร่ เช่น ที่ runlevel 2, 3, 4 ให้รันลำดับที่20 และ 5 ให้รันที่ 30 ส่วน runlevel ที่ 0,1,6 ให้รันลำดับที่ 80 เราก็เพิ่มคำสั่งดังนี้
# update-rc.d apache2 start 20 2 3 4 . start 30 5 . stop 80 0 1 6 .
Adding system startup for /etc/init.d/apache2 ...
/etc/rc0.d/K80apache2 -> ../init.d/apache2
/etc/rc1.d/K80apache2 -> ../init.d/apache2
/etc/rc6.d/K80apache2 -> ../init.d/apache2
/etc/rc2.d/S20apache2 -> ../init.d/apache2
/etc/rc3.d/S20apache2 -> ../init.d/apache2
/etc/rc4.d/S20apache2 -> ../init.d/apache2
/etc/rc5.d/S30apache2 -> ../init.d/apache2
เป็นอันจบเนื้อหาเหนื่อยจริงๆ ยาวมั๊กๆ
อ้างอิง
http://www.debuntu.org/how-to-manage-services-with-update-rc.d






