banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix [Bài viết] Tìm hiểu về SysV init script  XML
  [Question]   [Bài viết] Tìm hiểu về SysV init script 29/04/2008 12:19:54 (+0700) | #1 | 128085
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
Init script giúp bạn kiểm soát các services (hay daemons) được khởi động cùng hệ thống, xác định xem services (hay daemons) nào sẽ chạy ở runlevel nào.

Có thể khái quát quá trình boot của dòng Red Hat/Fedora qua sơ đồ sau:

stage 1 -> stage 2 -> /boot/grub/grub.conf -> /sbin/init -> /etc/rc.d/rc.sysinit -> /etc/inittab -> /etc/rc.d/rc.local -> /etc/rc.d/init.d/functions -> /etc/rc.d/init.d
 

Với các services (hay daemons) được build từ binary, bạn hoàn toàn có thể dùng các công cụ đi kèm với mỗi distro để kiểm soát: chkconfig (Red Hat/Fedora) hay update-rc.d (Debian/Ubuntu), ... Nhưng nếu muốn auto start các dịch vụ được cài từ source, chúng ta cần phải viết init script

Để bắt đầu bạn có thể xem qua template về init script tại: /usr/share/doc/initscripts-xx/sysvinitfiles

Ở đoạn đầu của file này, tuy chúng đều bắt đầu bằng dấu # (thường được hiểu là comment trong script). Nhưng, có những dòng bắt buộc phải có (required) và có những dòng bạn có thể bỏ qua (optional).

Tiếp theo là các functions bạn có thể thao tác với dịch vụ: start, stop, status, restart, reload, condrestart, probe.

Xin đưa ra vài ví dụ và giải thích luôn để các bạn dễ hiểu:

init script viết cho Oracle:

Code:
#!/bin/bash
# chkconfig: 35 91 11
# description: Oracle auto start-stop script
# processname: oracle
# pidfile: /var/run/oracle.pid
#
export ORACLE_HOME=/home/oracle/oracle/product/10.2.0/db_2
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=orcl

case "$1" in
        start)
                echo -n "Starting Oracle databases: "
                su - oracle -c $ORACLE_HOME/bin/dbstart
                echo "Done."
                echo -n "Starting Oracle listeners: "
                su - oracle -c "$ORACLE_HOME/bin/lsnrctl start"
                echo "Done."
                touch /var/lock/subsys/oracle
                ;;
        stop)
                echo -n "Shutting down Oracle listeners: "
                su - oracle -c "$ORACLE_HOME/bin/lsnrctl stop"
                echo "Done."
                echo -n "Shutting down Oracle databases: "
                su - oracle -c $ORACLE_HOME/bin/dbshut
                echo "Done."
                rm -f /var/lock/subsys/oracle
                rm -fr /var/run/oracle.pid
                ;;
	restart)
                $0 stop
                sleep 2
                $0 start
                ;;
        *)
                echo "Usage $0: {start|stop|restart}"
                exit 1
esac

Oracle sẽ hoạt động ở runlevel 3 và 5, với độ ưu tiên khi khởi động là 91, khi dừng là 11.

Ở đoạn script dưới đây (viết cho Tomcat Container), bạn sẽ học được cách viết functions trong bash shell:

Code:
#!/bin/sh
#
# tomcat	Start/Stop the Tomcat servlet container.
# chkconfig: 35 55 55
# description: Start and stop Tomcat container
#
# Source funtions library.
. /etc/rc.d/init.d/functions

# Get config.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

export JAVA_HOME=/usr/local/jdk
export PATH=${PATH}:${JAVA_HOME}/bin

TOMCAT_HOME=/usr/local/tomcat

start()
{
	echo "Starting Tomcat service: "
	$TOMCAT_HOME/bin/startup.sh
	RETVAL=$?
	echo
}

stop()
{
	echo "Stopping Tomcat service: "
	$TOMCAT_HOME/bin/shutdown.sh
	RETVAL=$?
	echo
}

restart()
{
	stop
	start
}

case "$1" in
	start)
		start
		;;

	stop)
		stop
		;;

	status)
		status tomcat
		;;

	restart)
		restart
		;;

	*)
    		echo "Usage: $0 {start|stop|status|restart}"
    		exit 1
esac

exit 0


Tomcat cũng hoạt động ở runlevel 3 và 5, với độ ưu tiên cùng là 55 khi khởi động và dừng. Chức năng startstop được viết thành các functions nhỏ, sau đó được gọi lại trong restart và khối lệnh case ... esac.

Các bước còn lại:

+ Thêm quyền execute:
# chmod + x <script_name>

+ Đặt init script dưới sự quản lý chkconfig:
# chkconfig --add <script_name>

+ Bật trạng thái "on" tại runlevel 3 và 5:
# chkconfig --level 35 <script_name> on

+ Kiểm tra lại trạng thái ở các runlevel:
# chkconfig --list <script_name>

+ Kiểm tra sự hoạt động của <init_script>
# service <script_name> {start|stop|status|restart}

Giải thích một số ký hiệu:

$0: tên của script
$1, $2, ... $n: giá trị của tham số thứ nhất, thứ 2, ... thứ n
$#: tổng số lượng các tham số
$*, $@: liệt kê tất cả các tham số cách nhau bởi 1 khoảng trắng
$?: "exit status" của lệnh cuối cùng
Let's build on a great foundation!
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|