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 dịch] Tại sao init scripts lại yêu cầu lock files  XML
  [Question]   [Bài dịch] Tại sao init scripts lại yêu cầu lock files 29/01/2008 01:20:49 (+0700) | #1 | 112652
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
Nguồn: http://www.redhat.com/magazine/008jun05/departments/tips_tricks/

Khi một dịch vụ được khởi tạo qua init script, 1 file được tạo ra trong /var/lock/subsys với tên giống như init script. Khi dịch vụ ngừng chạy, file này sẽ bị xoá.

File này được ngầm hiểu là: một subsystem của dịch vụ bị locked nghĩa là dịch vụ đang chạy. Do dịch vụ có thể bao gồm nhiều file thi hành với tên khác nhau, nên việc tìm Process ID của một file thi hành đơn không đủ để xác định trạng thái của bản thân dịch vụ. Do đó, lệnh:
Code:
service <init script> status

sẽ làm 2 việc:
1. Kiểm tra PID
2. Kiểm tra file trong thư mục /var/lock/subsys

Nếu PID không được tìm thấy nhưng subsystem lại bị locked, bạn sẽ nhận được một thông báo như sau:
<service> dead but subsys locked 


Việc quản lý một subsystem của dịch vụ có 2 mục đích:
+ Nếu dịch vụ không lock subsystem, nó vẫn có thể được started và stoped qua service interface. Tuy nhiên khi chuyển qua lại giữa các runlevels, rc scripts sẽ kiểm tra thư mục /var/lock/subsys, nếu file không được tìm thấy, dịch vụ sẽ không được start hoặc stop đúng giữa các runlevels ngay cả khi đã có một symbolic links dành cho việc start và kill trong thư mục /etc/rc#.d
+ Thư mục /var/lock/subsys được kiểm tra mỗi khi reboot hoặc shutdown. Thứ tự shutdown như sau:
1. service <init script> stop
2. kill -SIGTERM
3. Ngừng 5s
4. kill -SIGKILL

Phương thức shutdown này được sắp xếp theo thứ tự các processes bị killed. Trong quá trình shutdown /etc/rc.d/init.d/killall sẽ kiểm tra /var/lock/subsys để tìm ra bất kỳ subsystems nào vẫn còn bị locked. Nếu một subsystem của service bị locked sau khi tất cả các dịch vụ khác đã ngừng chạy, killall script sẽ sử dụng chính tên file của subsystem để chạy lệnh: Code:
service <init script> stop

Lệnh này sẽ thử dừng dịch vụ một cách "mịn" trước khi chuyển qua bước 2 đến bước 4 "ép" phải kết thúc.

Tham khảo /etc/rc.d/init.d/killall script:
Code:
#! /bin/bash

# Bring down all unneeded services that are still running (there shouldn't 
# be any, so this is just a sanity check)

case "$1" in
   *start)
	;;
   *)
	echo $"Usage: $0 {start}"
	exit 1
	;;
esac
				      

for i in /var/lock/subsys/* ; do
	# Check if the script is there.
	[ -f "$i" ] || continue

	# Get the subsystem name.
	subsys=${i#/var/lock/subsys/}
	
	# Networking could be needed for NFS root.
	[ $subsys = network ] && continue

	# Bring the subsystem down.
	if [ -f /etc/init.d/$subsys.init ]; then
		/etc/init.d/$subsys.init stop
	elif [ -f /etc/init.d/$subsys ]; then
		/etc/init.d/$subsys stop
	else
		rm -f "$i"
	fi
done
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|