Làm cách nào để tạo tập lệnh trong /etc/init.d bắt đầu khi khởi động?


83

Tôi nghĩ rằng tôi đã đọc một cái gì đó một thời gian trước về điều này, nhưng tôi không thể nhớ nó đã được thực hiện như thế nào. Về cơ bản, tôi có một dịch vụ trong /etc/init.dđó tôi muốn bắt đầu tự động khi khởi động. Tôi nhớ nó có liên quan đến việc liên kết tập lệnh vào /etc/rc.dthư mục, nhưng hiện tại tôi không thể nhớ. Lệnh cho việc này là gì?

Tôi tin rằng tôi đang sử dụng công cụ phái sinh Fedora / CentOS.


Điều đó phụ thuộc vào hệ điều hành của bạn. Bạn đang chạy biến thể unix nào và nếu Linux, bản phân phối nào? Mà giữa /etc/init, /etc/init.d, /etc/rc.d, /etc/rc.localvà một vài chi tiết nào nó có?
Gilles

1
Tôi nghĩ rằng tôi đang trên CentOS hoặc một cái gì đó tương tự. Câu trả lời sẽ khác với Debian? Tôi cũng quan tâm đến một giải pháp cho Debian.
Naftuli Kay

Câu trả lời:


109

Nếu bạn đang sử dụng hệ thống dựa trên Red Hat, như bạn đã đề cập, bạn có thể thực hiện các thao tác sau:

  1. Tạo một kịch bản và đặt vào /etc/init.d(ví dụ /etc/init.d/myscript). Kịch bản nên có định dạng sau:
#!/bin/bash
# chkconfig: 2345 20 80
# description: Description comes here....

# Source function library.
. /etc/init.d/functions

start() {
    # code to start app comes here 
    # example: daemon program_name &
}

stop() {
    # code to stop app comes here 
    # example: killproc program_name
}

case "$1" in 
    start)
       start
       ;;
    stop)
       stop
       ;;
    restart)
       stop
       start
       ;;
    status)
       # code to check status of app comes here 
       # example: status program_name
       ;;
    *)
       echo "Usage: $0 {start|stop|status|restart}"
esac

exit 0 

Định dạng này khá chuẩn và bạn có thể xem các tập lệnh hiện có /etc/init.d. Sau đó, bạn có thể sử dụng tập lệnh như vậy /etc/init.d/myscript starthoặc chkconfig myscript start. Các ckconfigtrang người đàn ông giải thích tiêu đề của kịch bản:

 > This says that the script should be started in levels 2,  3,  4, and
 > 5, that its start priority should be 20, and that its stop priority
 > should be 80.

Ví dụ bắt đầu, dừng và mã trạng thái sử dụng các hàm trợ giúp được xác định trong /etc/init.d/functions

  1. Kích hoạt tập lệnh

    $ chkconfig --add myscript 
    $ chkconfig --level 2345 myscript on 
    
  2. Kiểm tra tập lệnh thực sự được bật - bạn sẽ thấy "bật" cho các cấp độ bạn đã chọn.

    $ chkconfig --list | grep myscript
    

3
Chkconfig là những gì bạn muốn. +1
whoami

Tại sao init bắt đầu một cái gì đó tại runlevels 2, 3, 4 và 5? Bạn có phải cẩn thận để tránh khởi động máy chủ tại runlevel 2 không? Và runlevel 4 không được xác định trên RHEL, vậy tại sao bạn thử khởi động nó tại runlevel? Không chỉ trích, chỉ muốn biết. Tôi là người dùng Slackware bản địa.
Bruce Ediger

4 không được xác định trên RHEL, nhưng nó tồn tại. Bạn có thể đánh cắp nó cho những thứ của riêng bạn.
Kevin M

Tiêu đề được lấy từ trang man chkconfig. Cá nhân tôi gắn bó với 235 hoặc chỉ 35 trong hầu hết các trường hợp.
canen

Có một bản ghi tôi có thể xem xét nếu một cái gì đó không bắt đầu trong khi khởi động?
Utkarsh Sinha

10

Bạn kiểm tra, những gì runlevel máy của bạn thường bắt đầu vào.

runlevel

Thường thì đây là 5 hoặc 2 - có nhiều quy ước khác nhau, nhưng không có gì thực sự được thiết lập, afaik. Ubuntu sử dụng 2, trong khi phân phối cũ tôi đã sử dụng luôn được sử dụng

  • 1 Người dùng đơn (siêu người dùng)
  • 2 người dùng
  • 3 người dùng + mạng
  • 4 không sử dụng / người dùng có thể xác định
  • 5 người dùng, mạng + X11

Sau đó, bạn tạo một liên kết tượng trưng từ tập lệnh init của bạn, có thể /etc/init.d/foobarđể/etc/rc2.d/SXYfoobar

S có nghĩa là 'Bắt ​​đầu tập lệnh này trong runlevel này (ở đây: 2). XY là một số thập phân có hai chữ số, có liên quan đến chuỗi, các tập lệnh được bắt đầu.

Nếu bạn phụ thuộc vào tập lệnh S45barfoo để chạy trước bạn và S55foustoo tùy thuộc vào tập lệnh của bạn, bạn sẽ chọn xy trong khoảng từ 45 đến 55. Đối với các số bằng nhau, thứ tự khởi động không xác định.

Trong khi đó, Ubuntu đã chuyển (đang chuyển đổi) sang một quy trình khởi động khác, được gọi là upstart.

Và lưu ý: Không phải lúc nào các liên kết liên kết đến /etc/rcX.d- đôi khi nó /etc/init/rcX.dhoặc một cái gì đó tương tự, nhưng nó phải dễ tìm, ở đâu đó bên dưới / vv.

Nếu bạn muốn bắt đầu một cái gì đó ở cuối tập lệnh bắt đầu, /etc/rc.localsẽ là tệp cần tìm, nhưng nếu nó phụ thuộc vào X11 đã chạy, bạn có thể tìm tùy chọn tự khởi động của môi trường máy tính để bàn hoặc /etc/X11/Xsession.d/với một mẫu tương tự như được mô tả ở trên.

Nếu bạn phụ thuộc vào mạng đang hoạt động, có một thư mục riêng (if-up.d) và dành cho các thiết bị được gắn kết như ổ USB ngoài /etc/udev/rules.d/.


Không có lệnh nào liên kết tượng trưng cho bạn? Tôi nghĩ rằng tôi nhớ một cái gì đó như thế.
Naftuli Kay

1
Phải không update-rc.d?
Naftuli Kay

GUI hay dòng lệnh? DE của bạn có thể cung cấp một công cụ để đánh dấu các đường băng, nơi bắt đầu hoặc dừng tập lệnh của bạn. Tôi đã thấy một cái gì đó như thế, nhưng không nhớ tên và cách chỉ định số (xy).
người dùng không xác định

Dòng lệnh. Nó xử lý liên kết tượng trưng cho bạn và cho phép bạn bật công tắc xem các tập lệnh nhất định có chạy hay không.
Naftuli Kay

3

Như Naftuli Tzvi Kay đã hỏi về Debian ở trên: Bắt đầu với Debian 6, tập lệnh của bạn phải chứa tiêu đề LSB (Cơ sở tiêu chuẩn Linux) cho biết các phụ thuộc và khả năng của nó ( xem trang wiki debian ).

Nếu có tiêu đề LSB, bạn có thể sử dụng insservđể đưa tập lệnh của mình vào quá trình khởi động ( xem một trang wiki debian khác ).

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.