Sự khác biệt giữa /etc/rc.local và /etc/init.d/rc.local là gì?


30

Tôi muốn thêm một iptablesquy tắc vĩnh viễn cho cái mới của mình VPSvà sau khi tìm kiếm trên google ngắn gọn, tôi đã ngạc nhiên rằng có hai nơi quy tắc này có thể được thêm vào, có vẻ như giống hệt nhau: /etc/rc.local/etc/init.d/rc.local. Có lẽ ai đó biết tại sao hai nơi để mã khởi động đơn giản được đặt? Có phải hương vị linux cụ thể (nhưng Ubuntu có cả hai!)? Hoặc một trong số họ bị phản đối?


1
Một nên là một liên kết tượng trưng cho người khác.
Ignacio Vazquez-Abrams

2
@ IgnacioVazquez-Abrams Trên Ubuntu Server 12.04 x86 LTS chúng hoàn toàn khác nhau :(.
grigoryvp

1
@ IgnacioVazquez-Abrams: Trên Debian dường như cũng khác.
Emanuel Berg

3
Đáng để kiểm tra: Tôi đã hỏi một câu hỏi về /etc/rc.localmột thời gian trở lại.
Emanuel Berg

Câu trả lời:


31

/etc/init.dđược duy trì trên Ubuntu để tương thích ngược với các công cụ sysvinit. Nếu bạn thực sự nhìn vào /etc/init.d/rc.localbạn sẽ thấy (cũng từ Máy chủ 12.04 LTS):

#! /bin/sh
### BEGIN INIT INFORMATION
# Provides:          rc.local
# Required-Start:    $remote_fs $syslog $all
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist
### END INIT INFO

"Run /etc/rc.local" chính xác là những gì nó làm. Toàn bộ /etc/rc.locallà:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exit 0

Tôi đoán mục đích của việc này là cung cấp một vị trí đơn giản đã chết để đặt các lệnh shell mà bạn muốn chạy khi khởi động, mà không phải xử lý các công cụ dịch vụ dừng | bắt đầu /etc/init.d/rc.local.

Vì vậy, nó trong thực tế là một dịch vụ, và có thể được chạy như vậy. Tôi đã thêm một echodòng vào /etc/rc.localvà:

»service rc.local start
hello world

Tuy nhiên, tôi không tin rằng nó được tham chiếu bởi bất cứ thứ gì trong thư mục mới bắt đầu /etc/init(không phải init.d!):

»initctl start rc.local
initctl: Unknown job: rc.local

Có một vài dịch vụ "RC" mới bắt đầu:

»initctl list | grep rc
rc stop/waiting
rcS stop/waiting
rc-sysinit stop/waiting

Nhưng dường như không ai trong số họ có liên quan gì đến RC.local.


5

Đây là nhiều hơn một điều cụ thể phân phối. (giống như, bạn sẽ không tìm thấy RC.local khác nhau trong CentOS).

Bây giờ đến câu hỏi thực tế của bạn, tôi nghĩ rằng việc thêm bất cứ thứ gì vào /etc/init.d/rc.local sẽ khiến nó bắt đầu như một "dịch vụ" trong khi đó, mọi thứ bên trong /etc/rc.local sẽ chỉ khởi chạy tập lệnh đó khi khởi động.

Tôi không thực sự chắc chắn về lý do tại sao Ubuntu vẫn duy trì cả hai? (Có lẽ ai đó có thể làm sáng tỏ phần này !!)


Sự khác biệt giữa lệnh được thực thi "như một dịch vụ" và mã được "khởi chạy đơn giản khi khởi động" là gì? Có một số bảo mật hoặc những gì?
grigoryvp

Sự khác biệt cốt lõi giữa hai bản chất là về Dịch vụ và quy trình. ;) Tôi đoán mục đích cơ bản sẽ chỉ là bảo mật. Bạn có thể thấy liên kết này thú vị: unixmen.com/managing-your-service-and- Processes
thực dụng

Điều này là không chính xác! Chúng không phải là cùng một kịch bản, nhưng chúng một dịch vụ - /etc/init.d/rc.localkhông dừng bắt đầu công cụ /etc/rc.local(xem câu trả lời của tôi để biết thêm chi tiết).
goldilocks

@goldilocks: Cảm ơn câu trả lời rất mô tả và kỹ lưỡng nhưng tôi không rõ phần nào trong câu trả lời của tôi mà bạn đề cập là không chính xác? Nói một cái như một dịch vụ nghĩa là nó có thể thực hiện công việc "bắt đầu" và "dừng lại", trong khi cái kia chỉ đơn giản là một quá trình. Xin hãy sửa tôi nếu tôi không có ý nghĩa ở đây.
thực dụng

2
@paticsatic Bởi vì /etc/rc.localtập lệnh là quy trình thực thi được điều chỉnh bởi /etc/initd/rc.localtập lệnh, giống như (ví dụ) /bin/syslogsẽ là quy trình thực thi được điều chỉnh bởi /etc/initd/syslog. Bạn nói rõ ràng đó /etc/rc.localchỉ là một kịch bản khởi động, so với /etc/initd/rc.localviệc là một dịch vụ cấp chạy hoàn toàn riêng biệt.
goldilocks
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.