Làm thế nào để thực thi một kịch bản shell khi khởi động?


13

Tôi đã tạo một kịch bản để bắt đầu một máy chủ (câu hỏi đầu tiên của tôi). Bây giờ tôi muốn nó chạy trên hệ thống khởi động và khởi động máy chủ được xác định. Tôi nên làm gì để thực hiện điều này?

Phát hiện của tôi cho tôi biết đặt tệp này vào /etc/init.dvị trí và nó sẽ thực thi khi hệ thống khởi động. Nhưng tôi không thể hiểu được lập luận đầu tiên về khởi nghiệp sẽ như startthế nào? Đây có phải là xác định trước ở đâu đó để sử dụng startnhư $1? Nếu tôi muốn có một trường hợp startallsẽ khởi động tất cả các máy chủ trong tập lệnh, thì các tùy chọn tôi có thể quản lý là gì?

Kịch bản của tôi là như thế này:

#!/bin/bash

case "$1" in
start)
     start
    ;;
stop)
    stop
    ;;

restart)
    $0 stop
    $0 start
    ;;
*)
    echo "usage: $0 (start|stop|restart)"
;;
esac

Tôi biết cái này đã cũ ... nhưng vỏ nên là '#! / Bin / sh' chứ không phải '#! / Bin / bash' / bin / sh có nhiều khả năng hoạt động trong trường hợp máy gặp sự cố trong quá trình khởi động (ví dụ / usr / lib không thể được gắn kết)
Rich Homolka

Câu trả lời:


19

/etc/init.dlà thư mục script, trong đó các script thực thi xuất hiện. Tuy nhiên, để chạy các tập lệnh theo một thứ tự cụ thể sau khi hệ thống của bạn khởi động, bạn cần thêm tệp vào /etc/rc#.dthư mục. Các mục xuất hiện ở đây cho hệ thống của bạn theo thứ tự và ở mức chạy các kịch bản cấp độ nào /etc/init.dsẽ được chạy. Số sau RC cho biết mức độ chạy của máy đang chạy, theo biểu đồ này:

http://en.wikipedia.org/wiki/Runlevel

Vì vậy, nếu bạn có:

/etc/init.d/importantscript

Sau đó, bạn cần các tệp (trống):

/etc/rc.d/rc3.d/S20importantscript
/etc/rc.d/rc6.d/K20importantscript

Chữ S có nghĩa là bắt đầu và chữ K có nghĩa là giết. Khi máy của bạn khởi động, hệ thống sẽ thông báo "Ah, tôi đang chạy ở RunLevel 3, hãy ghé qua RC3.d để xem tập lệnh nào trong '/etc/init.d' cần được chạy và theo thứ tự nào." Trong trường hợp này, hệ thống sẽ sắp xếp theo 'S' và sau đó là số sau 'S' và sẽ thực thi '/etc/init.d/importantscript start'. Số 20 chỉ dành cho mục đích đặt hàng ... tập lệnh của bạn sẽ chạy phía sau 'S19' và phía trước 'S21'. Bạn có thể tạo các tệp này chỉ bằng cách thực hiện:

sudo touch /etc/rc.d/rc3.d/S20importantscript

Đây cũng là một bản tóm tắt hay: http://www.linux.com/news/enterprise/systems-manloyment/8116-an-int sinhtion-to-service-runlevels-and-rcd-scripts


không phải nó phổ biến hơn đối với "ln -s /etc/init.d/script" đối với RCX.d / *?
ozma

8

Bạn không phải --- và không nên --- tạo tập tin trong /etc/rc.d/rcN.d/; những gì bạn nên làm thay vào đó là đưa ra một nhận xét trong việc đọc tập lệnh init của bạn

# chkconfig NNN A B

nơi NNNlà tập hợp các runlevel mà bạn muốn kịch bản tích cực (ví dụ, 345nếu nó hoạt động trong runlevel 3, 45), và ABlà điểm bắt đầu và dừng lại những ưu tiên. Sau đó chkconfig --add foo(giả sử tập lệnh của bạn được đặt tên foo) sẽ tạo các tệp /etc/rc.d/rcN.d/với tên thích hợp.

Sau đó bạn có thể sử dụng service foo barđể gửi barthông điệp tới kịch bản của bạn (ví dụ start, stop, bất cứ điều gì - đó là nơi bạn $1xuất phát từ).


0

$ 1 là đối số dòng lệnh được truyền cho tập lệnh của bạn, nó là một trong những bắt đầu, dừng hoặc khởi động lại. Trong openSUSE , tôi không nhớ có một tùy chọn để chuyển các đối số khác vào tập lệnh khi sử dụng trình soạn thảo runlevel, vì vậy tôi nghĩ rằng đây có lẽ là những điều duy nhất bạn nên sử dụng.

Tôi không sử dụng CentOS cho mình, nhưng có vẻ như chương trình kiểm soát những gì được bắt đầu tại đó runlevel là ntsysv .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.