Chạy một kịch bản trong khi khởi động / khởi động; init.d vs cron @reboot


48

Tôi hiện đang cố gắng tìm hiểu sự khác biệt giữa init.dvà cron @rebootđể chạy tập lệnh khi khởi động / khởi động hệ thống.

Việc sử dụng @reboot(phương pháp này đã được đề cập trong diễn đàn này bởi hs.framra ) là một số đơn giản hơn, chỉ cần đi vào crontab -evà tạo một @reboot /some_directory/to_your/script/your_script.txtvà sau đó your_script.txtsẽ được thực thi mỗi khi hệ thống được khởi động lại. Một lời giải thích sâu sắc @rebootở đây

Hoặc bằng cách nhúng /etc/init.d/your_script.txtvào dòng thứ hai của tập lệnh của bạn, tức là:

#!/bin/bash
# /etc/init.d/your_script.txt

Bạn có thể chạy chmod +x /etc/init.d/your_script.txtvà điều đó cũng sẽ dẫn your_script.txtđến việc chạy mỗi khi hệ thống được khởi động.

Câu 1: Sự khác biệt chính giữa hai là gì?
Q2: Cái nào mạnh hơn?
Câu 3: Có một trong hai tốt hơn không?
Q4: Đây có phải là cách chính xác để nhúng tập lệnh để chạy trong khi khởi động không?

Tôi sẽ kết hợp một tệp bash .sh để chạy trong khi khởi động.


2
Cũng có liên quan là systemd, link1 link2
Rufus

Câu trả lời:


37

init.d, còn được gọi là tập lệnh SysV, có nghĩa là bắt đầu và dừng dịch vụ trong quá trình khởi tạo và tắt hệ thống. ( /etc/init.d/tập lệnh cũng được chạy trên các hệ thống hỗ trợ systemd để tương thích).

  • Kịch bản được thực thi trong quá trình khởi động và tắt máy (theo mặc định).
  • Kịch bản nên là một tập lệnh init.d, không chỉ là một tập lệnh. Nó nên hỗ trợ startstophơn thế nữa (xem chính sách Debian )
  • Kịch bản có thể được thực thi trong quá trình khởi động hệ thống (bạn có thể xác định khi nào).

crontab(và do đó @reboot).

  • cron sẽ thực thi bất kỳ lệnh hoặc tập lệnh thông thường, không có gì đặc biệt ở đây.
  • bất kỳ người dùng nào cũng có thể thêm một @reboottập lệnh (không chỉ root)
  • trên hệ thống Debian có systemd: @reboot của cron được thực thi trong thời gian multi-user.target.
  • trên hệ thống Debian có SysV (không phải systemd), crontab (5) đề cập: Xin lưu ý rằng khởi động, theo như @reboot, là thời điểm khởi động cron (8). Đặc biệt, có thể là trước khi một số trình nền hệ thống, hoặc các cơ sở khác, được khởi động. Điều này là do trình tự khởi động của máy.
  • thật dễ dàng để lên lịch cho cùng một kịch bản khi khởi động và định kỳ.

/etc/rc.localthường được coi là xấu xí hoặc không được chấp nhận (ít nhất là bởi redhat ), tuy nhiên nó vẫn có một số tính năng hay:

  • RC.local sẽ thực thi bất kỳ lệnh hoặc tập lệnh thông thường, không có gì đặc biệt ở đây.
  • trên hệ thống Debian có SysV (không phải systemd): rc.locallà (gần như) dịch vụ cuối cùng bắt đầu.
  • nhưng trên hệ thống Debian có systemd: rc.localđược thực thi network.targettheo mặc định (không phải network-online.target!)

Về systemd's network.targetnetwork-online.target, hãy đọc Dịch vụ chạy sau khi Mạng kết thúc .


Trong Unfox 16.04 của tôi, tôi cần xóa /var/run/crond.reboottệp mỗi lần, nếu tôi muốn hơn các công việc cron @reboot được thực thi mỗi khi sistem khởi động. Nếu tập tin này tồn tại thì các công việc cron @reboot sẽ không được thực thi
Albert Català

@ Albert-Catala gửi một lỗi cho Ubuntu!
Franklin Piat

12

Thứ nhất, một sự làm rõ là theo thứ tự:

  • init.d là thư mục lưu trữ các tập lệnh kiểm soát dịch vụ, nó kiểm soát việc bắt đầu và dừng các dịch vụ như httpdhoặccron
  • RC.local là một dịch vụ cho phép chạy các tập lệnh tùy ý như là một phần của quy trình khởi động hệ thống

Về việc sử dụng rc.localhay cronchạy kịch bản của bạn tốt hơn , tôi nghi ngờ rằng đó là một câu hỏi về tính thẩm mỹ nhiều hơn là tính thực tế. cron, như một bộ lập lịch tác vụ, được dùng như một phương pháp để thực hiện bảo trì hoặc bảo trì máy, chẳng hạn như kiểm tra cập nhật, làm sạch bộ nhớ cache hoặc thực hiện kiểm tra bảo mật. Điều này không có nghĩa là nó bị giới hạn trong việc thực hiện các chức năng đó, vì nó có thể chạy bất kỳ tập lệnh hoặc lệnh nào mong muốn tại thời điểm được chỉ định (chẳng hạn như @reboot).

rc.localMặt khác, việc sử dụng sẽ thuộc nhiều loại nhiệm vụ cấu hình hệ thống, do rc.local, được thực thi bởi hệ thống init của máy, thường chịu trách nhiệm thiết lập cấu hình, dịch vụ hoặc môi trường của máy (nhưng một lần nữa, không giới hạn chỉ nhiệm vụ này).

Tuy nhiên, cả hai điểm này đều cần được giảm bớt bởi thực tế là không phải tất cả các hệ thống init đều cung cấp một rc.localcơ chế và không phải tất cả các trình nền cron đều cung cấp @rebootthẻ psuedo.

Điểm thưởng

Như đã đề cập, init.dlà thư mục chứa các tập lệnh kiểm soát các dịch vụ có thể được khởi động hoặc dừng trên hệ thống của bạn (ít nhất là trên các máy sử dụng SysVhệ thống init type). Tùy thuộc vào hệ thống init của bạn và mục đích của tập lệnh của bạn, có thể hợp lý để chuyển tập lệnh của bạn thành tập lệnh init để được chạy theo cách tương tự như một dịch vụ. Tuy nhiên, điều này phụ thuộc rất nhiều vào hệ thống init của bạn vì khung xung quanh cách các tệp này được xây dựng có thể khác nhau rất nhiều.

Tư cuôi cung

Cũng cần lưu ý rằng thông thường các tập lệnh bash kết thúc bằng một hậu tố .shthay vì .txt, vì điều này ngay lập tức biểu thị tệp là tập lệnh shell thay vì tập tin văn bản. Điều đó đang được nói, miễn là nó có một shebang ( #!/bin/bash) ở đầu tệp, hoặc được gọi là bash /path/to/script.whatever, điều đó không quan trọng trong việc thực thi tập lệnh.


bashcác tập lệnh thường không (và có thể không nên) kết thúc bằng một shphần mở rộng.
mikeerv

1
@mikeerv: Mặc dù tôi đồng ý rằng hầu hết các tập lệnh bash không (và có thể không nên) có bất kỳ tiện ích mở rộng nào, thông thường các tệp có phần mở rộng ".sh" là tập lệnh bash - xem "Tập tin .sh là gì?" .
David Cary

@DavidCary - đó dường như không phải là một nguồn rất có thẩm quyền.
mikeerv

1
Wikipedia: "danh sách các phần mở rộng tên tệp"Wikipedia: "shell script" cũng đề cập đến phần mở rộng ".sh" phổ biến đáng ngạc nhiên, với các tài liệu tham khảo.
David Cary

1
"Các tập lệnh bash thường kết thúc bằng một hậu tố .shthay vì.txt " - nghĩa cụ thể shchính xác hơn là phần mở rộng tên tệp cho tập lệnh bash (hoặc tập lệnh shell khác) so với txtthông thường biểu thị văn bản thuần túy. Bạn có thể sử dụng bất kỳ tiện ích mở rộng nào khiến bạn cười khúc khích, nhưng quy ước chung sẽ là, nếu sử dụng tiện ích mở rộng shsẽ phù hợp hơn và thường được sử dụng; mặc dù điều đó không bắt buộc, đặc biệt đối với các tập lệnh được dự định thực hiện từ PATH.
thúc

3

Tôi đang viết câu trả lời của tôi dưới đây;

Câu 1: Sự khác biệt chính giữa hai là gì?

Ngoài những khác biệt được đề cập bởi những người dùng khác ở trên, tôi muốn nhấn mạnh điểm @reboot phụ thuộc vào daemon crond. Bạn phụ thuộc vào thứ tự bắt đầu crond. Mặc dù hầu hết các trường hợp, crond bắt đầu tốt nhưng đôi khi nó có thể không khởi động (ít nhất tôi đã thấy một số thất bại trong một số dự án của tôi). Khi bạn viết một tập lệnh init, thất bại thường xảy ra nếu bạn làm điều gì đó sai trong tập lệnh của mình (ví dụ: dựa vào một dịch vụ sẽ bắt đầu sau dịch vụ của bạn)

Câu 2: Cái nào mạnh hơn?

Dựa trên, tôi nghĩ rằng init mạnh mẽ hơn. Nhưng có một điểm khác như được đề cập bởi "Franklin Piat" trong câu trả lời đầu tiên. Thông thường bạn cần init script cho một daemon và bạn nên tuân theo chính sách

Câu 3: Có một trong hai tốt hơn không?

Tôi không nghĩ vậy (RC.local hơi cũ và không dùng nữa)

Q4: Đây có phải là cách chính xác để nhúng tập lệnh để chạy trong khi khởi động không?

Đúng. Thông thường các nhà văn ứng dụng / gói làm theo cách này.

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.