Tại sao lệnh trong /etc/rc.local không được thực thi trong khi khởi động?


39

Tôi có một lệnh duy nhất trong /etc/rc.localtập lệnh của mình được cho là bắt đầu cập nhật trình nền cho Tiny Tiny RSS khi khởi động, nhưng tập lệnh không được thực thi trong khi khởi động. Tại sao?

Toàn bộ tập tin /etc/rc.local:

#!/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.

/sbin/start-stop-daemon -b -c www-data:www-data -S -x /usr/bin/php /var/www/ttrss/update_daemon2.php -- -quiet

exit 0

/etc/rc.local được thực thi:

# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 342 May 25 16:14 /etc/rc.local

/etc/init.d/rc.local tồn tại và được thực thi:

# ls -l /etc/init.d/rc.local
-rwxr-xr-x 1 root root 801 Jul 27  2012 /etc/init.d/rc.local

/etc/init.d/rc.local được cho là được thực thi khi khởi động cho runlevel này:

# runlevel 
N 2
# ls -l /etc/rc2.d/S99rc.local 
lrwxrwxrwx 1 root root 18 Sep 22  2012 /etc/rc2.d/S99rc.local -> ../init.d/rc.local

Nếu tôi gọi /etc/rc.local theo cách thủ công từ dòng lệnh thì update_daemon sẽ tải ...

# /etc/rc.local
# ps ax | grep update_daemon2.php
2233 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet
2234 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet

... mà tôi phải nhớ mỗi lần máy chủ khởi động lại cho đến khi vấn đề này được khắc phục.

Các câu hỏi tương tự đã tồn tại, nhưng cho đến nay tôi không thể áp dụng thông tin trong vấn đề cụ thể của mình.

Tại sao lệnh trong RC.local không được thực thi trong khi khởi động?


Có thể là do các requirettythiết lập. Khi bạn đã đăng nhập, bạn đang thực thi tập lệnh trong TTY nhưng trong quá trình khởi động hệ thống, nó không ở trong TTY. Liên kết này có thể hỗ trợ bạn shell-tips.com/2014/09/08/ Cảm ơn.
KICT

Câu trả lời:


23

rc.localscript thoát nếu có lỗi xảy ra trong khi thực hiện bất kỳ lệnh nào của nó (đề cập đến -ecờ trong #!/bin/sh -e).

Có thể một số điều kiện tiên quyết không được đáp ứng khi bạn cố chạy các lệnh của mình khi rc.localthực thi diễn ra, do đó việc thực thi lệnh của bạn thất bại.

Tôi đã gặp điều tương tự trong khi cài đặt thủ công cpu và không thực hiện được rc.local. Đây là cách giải quyết tùy chỉnh của tôi, sử dụng update-rc.dđể làm cho các lệnh của bạn chạy khi khởi động:

  1. Tạo một tệp myscript.shtrong thư mục /etc/init.dvới một tiêu đề:#!/bin/sh
  2. Đặt các lệnh tùy chỉnh của bạn làm nội dung
  3. Làm cho nó thực thi: sudo chmod +x /etc/init.d/myscript.sh
  4. Tạo liên kết tượng trưng cho tập lệnh của bạn cho nhiều đường chạy khác nhau: sudo update-rc.d myscript.sh defaults

Ngoài ra, bạn có thể kiểm tra /etc/network/if-up.dtập lệnh và xem liệu bạn có thể kích hoạt các lệnh của mình khi bắt đầu kết nối mạng không.


Cảm ơn bạn đã trả lời. Thiết lập của tôi đã thay đổi kể từ khi tôi đăng câu hỏi, vì vậy tôi không thể kiểm tra xem câu trả lời của bạn có giải quyết được vấn đề không.
xx

Xin vui lòng cho tôi biết bước 4 làm gì? Tôi mới đếnupdate-rc.d
Mohith7548

7

tôi đã có một số vấn đề tương tự trong RC.local không thực hiện khi khởi động

sshades cung cấp cho tôi câu trả lời sau:

Ubuntu hiện đang sử dụng systemd và RC.local hiện được coi là một dịch vụ bị tắt "theo mặc định". Bạn có thể bật RC.local "bật" bằng cách nhập lệnh sau và khởi động lại:

sudo systemctl enable rc-local.service

https://askubfox.com/a/770033/395498

Mặc dù tôi đã không thử nghiệm giải pháp của mình nhưng tôi nghĩ nó nghe có vẻ hợp lý và sẽ hoạt động. Tuy nhiên :

Tôi cũng tìm thấy một giải pháp rằng thêm tập lệnh vào ./.config/autostart-scripts/ sẽ thực hiện thủ thuật


7
Bắt lỗi này. Các tệp đơn vị không có cấu hình cài đặt (WantedBy, requiredBy, Ngoài ra, cài đặt Bí danh trong phần [Cài đặt] và DefaultInstance cho các đơn vị mẫu). Điều này có nghĩa là chúng không có nghĩa là được kích hoạt bằng systemctl. Các lý do có thể có loại đơn vị này là: 1) Một đơn vị có thể được kích hoạt tĩnh bằng cách được liên kết tượng trưng từ thư mục .wants / hoặc .requires / của đơn vị khác. 2) Mục đích của một đơn vị có thể là hoạt động như một người trợ giúp cho một số đơn vị khác có sự phụ thuộc yêu cầu vào đơn vị đó.
Rıfat Erdem Sahin

Tôi cũng nhận được lỗi này. Nếu rc.localbị tắt, thay thế là gì?
Ben

5

thử sudo sysv-rc-confvà kiểm tra nếu rc.localđược kích hoạt

rc.local         [ ]   [x]   [x]   [x]   [x]   [ ]   [ ]   [ ]

Vâng, nó được kích hoạt.
xx

lệnh này có cần cài đặt không?
jcollum

1
@jcollum vâng, nó là một chương trình từ một gói có tên giống nhau. Để cài đặt, gõsudo apt install sysv-rc-conf
banan3'14

rc.localthậm chí không có trong danh sách dịch vụ của tôi!
Ben

5

Hãy chắc chắn rằng tập lệnh RC.local có thể thực thi được:

sudo chmod +x /etc/rc.local

Sau đó, kích hoạt nó:

sudo systemctl enable rc-local.service

Khởi động lại hệ thống hoặc khởi động tập lệnh theo cách thủ công bằng cách chạy:

sudo systemctl start  rc-local.service

Trạng thái dịch vụ có thể được hiển thị bằng cách chạy:

$ sudo systemctl status rc-local.service
 rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled) 
Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: active (running) since Mon 2018-04-02 10:39:44 -03; 1s ago
  Process: 2044 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
 Main PID: 2049 (svscanboot)
Tasks: 3
 Memory: 556.0K
CPU: 10ms
CGroup: /system.slice/rc-local.service

Bạn không cần phải kích hoạt dịch vụ theo cách thủ công. Nếu tệp tồn tại và có thể thực thi được, systemd sẽ tự động kích hoạt rc-localdịch vụ.
muru

4

Chúng tôi đã gặp sự cố này trên một số máy chủ được lưu trữ đang tải quy tắc FW.

Trên các hộp này, chúng khởi động lại RẤT nhanh chóng và chúng tôi thấy chỉ cần đặt "chế độ ngủ 1" trong RC.local trước khi các báo cáo tải dường như khắc phục được sự cố. Tôi đoán nó đã cho một ít thời gian để các giao diện giải quyết trước khi tải các quy tắc FW.


1
Cảm ơn bạn. sleep 1giải quyết vấn đề của tôi Thú vị là tôi có rất nhiều máy chủ nhưng chỉ có một máy có vấn đề này.
Qian Chen

1

Tôi đã từng chỉnh sửa rc.localbằng Notepad trong Windows và nó bắt đầu gặp vấn đề này.

Trong trường hợp này, sử dụng trình soạn thảo văn bản hỗ trợ Chuyển đổi EOL, chẳng hạn như Notepad ++, để chuyển đổi kiểu EOL thành 'Unix', có thể giải quyết nó.

Bạn cũng có thể làm điều đó bằng :set ff=unixVim.


1

Tôi đã tìm thấy trong các thùng chứa Ubuntu lxc rằng nếu RC.local có một shebang hoàn toàn chính xác, vd

#!/bin/sh

nó thất bại, nhưng nếu bạn loại bỏ shebang thì nó hoạt động.

Không hiểu được lý do tại sao hoặc lớp vỏ nào nó sử dụng Tôi nghĩ rằng nó đánh bom vào lần đầu tiên khác không. (Trong các bản cài đặt Ubuntu khác, shebang thích hợp không phải là vấn đề)


0

Bạn sẽ phải đảm bảo rằng nó /etc/rc.localđược thực thi trong quá trình khởi động máy chủ bằng lệnh:

sudo systemctl enable rc-local.service

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.