Từ init.d đến upstart, có cầu không?


11

Tôi đã có một tập lệnh hoàn toàn tốt để sử dụng trong /etc/init.d. Trên thực tế, tôi có rất nhiều trong số chúng, tất cả được tạo bằng Trình bao bọc dịch vụ Java Tanuki.

Dường như với tôi rằng có thể có một khuôn mẫu đơn giản để gói một tập lệnh shell như vậy thành một tập lệnh mới, nhưng một chút googling không tiết lộ.

Tui bỏ lỡ điều gì vậy?

Câu trả lời:


9

Tôi không nhớ đã nhìn thấy một mẫu cho việc này. Tuy nhiên, có một chút mỉa mai về mặt kỹ thuật, đó là sự khởi đầu của nó đang bắt đầu tập lệnh init.d của bạn ngay từ đầu nhờ vào công việc tương thích ngược RC và RCS.

Tôi sẽ xem xét viết lại bất cứ điều gì bạn có như một công việc mới bắt đầu, tuy nhiên, tôi biết rằng một số tập lệnh rất khó chuyển đổi, vì vậy đây là những gì tôi đã làm trong một thời gian trên một số tập lệnh của mình:

description "xyz"
author "xyz"
start on runlevel 5
stop on runlevel [!5]

pre-start script
    # do my work here to start the service
end script

post-stop script
    # do work here to stop the service
end script

Bây giờ tùy thuộc vào bản chất của dịch vụ, cho dù nó tồn tại hay tự rèn, bạn có thể cần thêm expect forkhoặc taskvào tệp công việc.

Chỉ cần hoàn thành suy nghĩ, thông thường, đây là tất cả những gì có trong một tập tin công việc mới bắt đầu. Tất cả các công việc bắt đầu trước được thực hiện, tất cả các công việc dọn dẹp đã hoàn tất, điều duy nhất còn lại là chính dịch vụ thường được thêm vào:

exec service_cmd

Để bắt đầu, tài liệu nói rằng chạy cấp 3,4 và 5 không được sử dụng. Vì vậy, bạn chỉ nên sử dụng chạy cấp 2.
djangofan

đã được một thời gian, nhưng tôi khá chắc chắn rằng 5 đã khởi động hệ thống với GUI, ít nhất là trước đây.
Joseph Rogers

6

Vì vậy, một điểm của công việc mới bắt đầu là viết đơn giản.

Có rất nhiều phép thuật shell shell trong các script init.d được lặp đi lặp lại. Báo cáo trường hợp, theo dõi pidfile, dòng bình luận lsb. Nó không rõ ràng làm thế nào để viết một tập lệnh init.d TỐT mà không cần phải đọc một tập lệnh.

Nếu bạn đã trải qua khó khăn trong việc viết tất cả những điều đó, thì bạn không cần một công việc mới bắt đầu trừ khi, như tôi đã đề cập trong một bình luận khác, bạn phụ thuộc vào một công việc / sự kiện mới nổi khác.

Nhưng thực sự, mới bắt đầu làm cho mọi thứ thực sự đơn giản. Bạn không cần phải bắt đầu trước trừ khi bạn cần thiết lập mọi thứ như tmpdirs, ulimits hoặc đối số thời gian chạy. Bạn không cần dừng lại sau khi bạn muốn đảm bảo dọn dẹp sau khi dịch vụ (dịch vụ thực sự cần được dọn sạch sau khi thoát ra bình thường).

Thông thường, một tập lệnh init.d khổng lồ với nhiều tùy chọn thực hiện theo công việc mới bắt đầu từ 10 - 15 dòng. Các tập lệnh init.d phức tạp nhất có thể có hầu hết logic của chúng được đưa vào trước khi bắt đầu. Chìa khóa ở đây là nó chỉ là một đoạn mã nhỏ để thiết lập môi trường cho quy trình, và không logic khi xử lý start / stop / respawn / etc.

Phần khó nhất, và phần mà mọi người thường mắc sai lầm nhất là biết khi nào nên bắt đầu / dừng công việc. start on runlevel [2345]có vẻ hợp lý, nhưng bỏ qua thực tế là mạng đang xuất hiện song song tại thời điểm đó, cũng như các hệ thống tập tin cục bộ gắn kết. Điều quan trọng là thử và tìm ra chính xác những điều tối thiểu bạn cần (các dịch vụ khác, hệ thống tập tin, mạng, v.v.) để chạy và bắt đầu khi những việc đó được thực hiện. Hầu hết các dịch vụ mạng truyền thống nên làm start on (local-filesystems and net-device-up IFACE!=lo).


3

Tôi nghĩ rằng Upstart duy trì khả năng tương thích ngược với các tập lệnh init kiểu SysV /etc/init.d. Bạn sẽ có thể chỉ sử dụng các tập lệnh init của bạn không thay đổi.


Nó có, nhưng thứ tự không còn quá dễ dàng để dự đoán. Các công việc mới bắt đầu có thể bắt đầu trước / sau khi tập lệnh RC2.d / S99mything của bạn đang chạy. Vì vậy, ngay khi bạn phụ thuộc vào một dịch vụ được quản lý mới nổi, bạn cần một công việc mới bắt đầu.
SpamapS

2
Là một hack, bạn có thể loại bỏ init script của bạn khỏi runlevel cụ thể, và thay vào đó thêm một loạt các dòng như /etc/init.d/myservice startđể /etc/rc.local, theo đúng thứ tự. Điều này sẽ đảm bảo rằng các dịch vụ của bạn khởi động lần cuối, sau tất cả các dịch vụ khác, bao gồm cả các dịch vụ được khởi động bởi Upstart init scripts.
Ryan C. Thompson
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.