Mục đích và cách sử dụng điển hình của /etc/rc.local


73

Tiêu đề trông như thế này:

#!/bin/sh -e
#
# rc.local - executed at the end of each multiuser runlevel
#
# Make sure that the script will "exit 0" on success or any other
# value on error.

Lý do cho tập tin này là gì (nó không chứa nhiều) và bạn thường đặt những lệnh nào trong đó? Một "runlevel nhiều người" là gì? (Tôi đoán rclà "chạy lệnh"?)


2
Tôi không biết đây có phải là mục đích "chính thức" của tệp hay không, nhưng tôi phát hiện ra rằng tôi có thể sử dụng tệp cho những gì sẽ xảy ra khi khởi động và sẽ yêu cầu siêu người dùng truy cập, nhưng không phải cung cấp mật khẩu. Điều đó thường liên quan đến màu sắc, bàn phím và những thứ khác. Kiểm tra một số ví dụ ở đây .
Emanuel Berg

Câu trả lời:


66

Một runlevel là một trạng thái của hệ thống, cho biết liệu nó đang trong quá trình khởi động hoặc khởi động lại hoặc tắt, hoặc trong chế độ người dùng đơn, hoặc chạy bình thường. Chương trình init truyền thống xử lý các hành động này bằng cách chuyển sang runlevel tương ứng. Theo Linux, các đường băng là theo quy ước :

  • S trong khi khởi động,
  • 0 trong khi tắt,
  • 6 trong khi khởi động lại,
  • 1 ở chế độ người dùng đơn và
  • 2 đến 5 trong hoạt động bình thường.

Runlevels 2 đến 5 được gọi là runlevels nhiều người vì chúng cho phép nhiều người dùng đăng nhập, không giống như runlevel 1 chỉ dành cho quản trị viên hệ thống.

Khi runlevel thay đổi, init chạy các tập lệnh RC (trên các hệ thống có init truyền thống - có các lựa chọn thay thế, như UpstartSystemd ). Các tập lệnh RC này thường khởi động và dừng các dịch vụ hệ thống và được phân phối cung cấp.

Kịch bản /etc/rc.localđược sử dụng bởi quản trị viên hệ thống. Theo truyền thống, nó được thực hiện sau khi tất cả các dịch vụ hệ thống bình thường được bắt đầu, vào cuối quá trình chuyển sang một runlevel nhiều người dùng. Bạn có thể sử dụng nó để bắt đầu một dịch vụ tùy chỉnh, ví dụ như một máy chủ được cài đặt /usr/local. Hầu hết các cài đặt không cần /etc/rc.local, nó được cung cấp cho thiểu số các trường hợp cần thiết.


2
Hôm nay tôi phát hiện ra rằng trên FreeBSD hiện tại, RC.local có thể được thực thi khá sớm. Chắc chắn không phải sau khi tất cả các dịch vụ hệ thống bình thường được bắt đầu. Tôi muốn có tiếng bíp khi sshd truy cập vào máy không đầu sẽ khả dụng và rc.localkhông phù hợp với lý do này. Vì câu hỏi ban đầu là về Debian, nhận xét này có lẽ không liên quan đến OP.
MvG

1
@MvG Cảm ơn thông tin. rc.localtheo truyền thống được chạy lần cuối, nhưng tôi thấy FreeBSD đã ngừng làm điều đó khi họ chuyển sang một hệ thống dựa trên sự phụ thuộc. Hãy nhớ rằng, ngay cả khi rc.localđược gọi sau /etc/rc.d/sshdđó, nó sẽ không hoạt động hoàn hảo: rc.localsẽ được gọi ngay sau khi sshdquá trình được bắt đầu, nó có thể được gọi trước khi sshdbắt đầu nghe mạng (nhưng chúng ta sẽ nói chuyện một phần mười giây nhất trong một thiết lập điển hình).
Gilles

Tôi đang cố gắng sử dụng nó để thiết lập mạng cho các thùng chứa lxc và tự động khởi động chúng. Nhưng nó dừng lại sau iptables-apply /root/iptables. Tôi đang trong quá trình tìm ra điều gì sai (chờ lần khởi động lại tiếp theo). Nhưng nếu bạn có bất cứ lời đề nghị nào, tôi đều nghe thấy.
x-yuri

1
@ x-yuri Điều này đòi hỏi nhiều thông tin hơn những gì bạn đã đăng ở đây. Tôi thậm chí còn không biết những gì mà nó có thể sử dụng. Đặt một câu hỏi mới giải thích những gì bạn đã làm.
Gilles

14

rc biểu thị "kiểm soát chạy",

Các multiuserrunlevel sẽ được định nghĩa là mức mà mạng có sẵn và do đó kết nối đến máy chủ có thể được thực hiện sử dụng các dịch vụ này thay cho các kết nối giao diện điều khiển cứng có dây.

Xin lưu ý, các máy chủ thường được quản lý bởi bộ xử lý dịch vụ (dưới nhiều tên khác nhau) hỗ trợ các kết nối mạng và lần lượt hoạt động như thể bạn thực sự có một bảng điều khiển có dây cứng.

Đối với rc.localtệp, đây là một tiện lợi để cho phép bạn chỉ định tất cả các đối tượng "cục bộ" (dành riêng cho trang web) (trình nền và / hoặc tập lệnh khởi động một lần) mà bạn muốn bắt đầu. Bạn có thể chọn sử dụng mô hình này hoặc thực sự cư trú '/etc/init.d' với các tập lệnh start / stop, một cách thích hợp.


1
Được rồi, nhưng tại sao tập tin ở đó, và khi nào bạn thường sử dụng nó, và làm thế nào (ví dụ, những lệnh nào có ý nghĩa để đặt vào nó)?
Emanuel Berg

4

Tôi chủ yếu sử dụng nó cho hai điều:

  1. để đăng nhập ngày và phiên bản kernel của mỗi lần khởi động lại. một lớp lót đơn giản có thể dễ dàng được thêm vào các hệ thống mà không có bất kỳ sự nhồi nhét nào ... và ít có xu hướng lịch sử khởi động bị hỏng hơn so với chạy uptimed.

  2. để hồi sinh thư mục /etc/rc.boot/ cũ đã từng ở debian cho đến vài năm trước. Tôi vẫn còn một số tập lệnh đơn giản trong đó không đáng để viết lại thành tập lệnh init.d (ví dụ: tập lệnh Q & D để gửi dmesg đến root và một tập lệnh khác sử dụng hdaparm để vô hiệu hóa spindown và blockdev để đặt đọc phía trước kích thước) và tôi rất vui khi chúng được chạy sau tất cả các tập lệnh khởi động khác.

ví dụ

echo "$(date +%s),$(date),$(uname -a)"  >> /var/log/reboot.log

[ -d /etc/rc.boot ] && run-parts /etc/rc.boot

Ngoài ra, tôi đã viết /etc/rc.local script vào đầu năm nay để phân phối centos và debian để lấy siêu dữ liệu kiểu ec2 từ openstack (bật http://169.254.169.254/) để VM có được IP, tên máy chủ, khóa ssh và thông tin cụ thể khác . kể từ đó, cloud-init đã được chuyển sang các distro này, vì vậy các đoạn script đã lỗi thời.


3

Các rc.localtập tin trên Debian là chủ yếu để tương thích với các hệ thống kiểu phi-init. Bạn không nên sử dụng nó.

Thay vào đó, bạn nên sao chép /etc/init.d/Skeletonvào một tập lệnh init mới cho bất cứ điều gì bạn muốn xảy ra trong khi thay đổi runlevels, sau đó sử dụng inservđể kích hoạt nó.


Cập nhật: Theo nhận xét dưới đây, câu trả lời này không còn được khuyến nghị. Tuy nhiên, câu trả lời này đã được đăng vài năm trước khi phản đối bộ xương và bộ xương đó vẫn tồn tại trong Debian không ổn định kể từ tháng 1 năm 2019.


unix.stackexchange.com/a/480897/5132 /etc/init.d/skeleton không phải là cách.
JdeBP
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.