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