• View :3180
  • Added:2009-09-11 15:27:40
  • License: cc-by_nc_sa

   วันนี้จะมาพูดถึงการจัดการ 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



Add comments
name:
E-mail:
Home page:
สุดยอด ชมตัวเองสบายใจที่สุดเลย
date: 2009-09-11 15:44:25
/etc/init.d/ รู้สึกว่าจะมีเฉพาะ debian base ช่วยเช็คด้วว่า Redhat base มีหรือเปล่านะครับ แล้วก็คำสั่ง update-rc.d ด้วยไม่รู้ว่ามีหรือเปล่าเช่นกันใน Redhat base
date: 2009-09-11 16:15:02
ใน Redhat base ไม่มีนะเค้าใช้อีกแบบนึงเดี๋ยวจะมาโพสบอก
date: 2009-09-11 21:26:28
ค้นหา
Custom Search
Adverties
2008 Ofebia. Creative Commons Attribution 3.0 License