Cách tốt nhất để làm một cái móc tắt máy?


9

Vì Ubuntu đã khởi động được một thời gian rồi, tôi muốn sử dụng một công việc mới để tắt máy một cách duyên dáng một số ứng dụng khi tắt hệ thống hoặc khởi động lại. Điều cần thiết là tắt hoặc khởi động lại hệ thống bị đình trệ cho đến khi các ứng dụng này bị tắt.

Các ứng dụng sẽ được khởi động thủ công vào dịp nào đó và khi tắt hệ thống sẽ tự động được kết thúc bằng một tập lệnh (mà tôi đã có). Vì các ứng dụng không thể kết thúc một cách đáng tin cậy mà không có (gần như tất cả) các dịch vụ khác đang chạy, nên việc kết thúc các ứng dụng phải được thực hiện trước khi phần còn lại của quá trình tắt máy bắt đầu.

Tôi nghĩ rằng tôi có thể giải quyết vấn đề này bằng một công việc mới bắt đầu sẽ được kích hoạt khi tắt máy, nhưng tôi không chắc chắn nên sử dụng sự kiện nào theo cách nào. Cho đến nay, tôi đã đọc các tuyên bố sau (một phần mâu thuẫn):

  • Không có sự kiện tắt máy nói chung khi mới bắt đầu
  • Sử dụng một khổ thơ như start on starting shutdowntrong định nghĩa công việc
  • Sử dụng một khổ thơ như start on runlevel [06S]trong định nghĩa công việc
  • Sử dụng một khổ thơ như start on starting runlevel [06S]trong định nghĩa công việc
  • Sử dụng một khổ thơ như start on stopping runlevel [!06S]trong định nghĩa công việc

Từ những khuyến nghị này, những câu hỏi sau đây phát sinh:

  • Có hay không có một sự kiện tắt máy chung trong sự khởi đầu của Ubuntu?
  • Cách được đề xuất để thực hiện "móc tắt máy" là gì?
  • Khi các sự kiện runlevel [x] được kích hoạt; Đây là khi đã vào runlevel hay khi vào runlevel?
  • Chúng ta có thể sử dụng một cái gì đó như start on starting runlevel [x]hoặc start on stopping runlevel [x]?
  • Điều gì sẽ là giải pháp tốt nhất cho vấn đề của tôi?

Cảm ơn rât nhiều

Câu trả lời:


2

startingrunlevellà các sự kiện riêng biệt, vì vậy bạn không thể nói một cách có ý nghĩa starting runlevel N.

Sự runlevel Nkiện này được phát ra khi bắt đầu vào runlevel. Nếu bạn start on runlevel Nsau đó nhiệm vụ của bạn chạy trên mục. Cách để chạy khi nhập vào runlevel là hoàn thành run on started rc RUNLEVEL=N.

Theo tôi hiểu, bạn cần phải start on runlevel [06S]làm những gì bạn muốn; trong lý thuyết nên chạy trước khi mọi thứ khác dừng lại. Để kiểm soát tốt hơn, bạn có thể sử dụng start on stopping apache or stopping mysql or ...để tác vụ của mình chạy trước khi bất kỳ trong số chúng được phép tắt.


Đã chỉnh sửa để thay đổi runlevel 5 thành S.


1
Ngoài ra, lý do duy nhất có một startupsự kiện nổi bật là một cái gì đó là cần thiết để "tố bơm". Sau khi một sự kiện đặc quyền được gửi, mọi thứ khác có thể, và được xác định bởi các công việc và tác vụ được kích hoạt bởi startup. Đối với việc không có một shutdownsự kiện duy nhất , có quá nhiều loại khác nhau shutdownđể điều đó có ý nghĩa. Tốt hơn là phụ thuộc trực tiếp vào các công việc bạn cần phải chạy.
geekizard

Cảm ơn rât nhiều. Tôi biết ơn chấp nhận trả lời của bạn vì nó trả lời câu hỏi của tôi và giải quyết vấn đề. Tuy nhiên, tôi có thêm một câu hỏi / nhận xét (không liên quan đến vấn đề): AFAIK, mục tiêu mới nhất là thay thế hoàn toàn khái niệm runlevel. Thực tế là chúng ta cần phải dựa vào các đường băng để có được một cái móc tắt máy toàn cầu mâu thuẫn với mục tiêu này. Tôi nghĩ rằng mới bắt đầu sẽ phải giới thiệu một sự kiện như vậy. Tôi hiểu rõ rằng sẽ tốt hơn nếu phụ thuộc vào công việc chúng ta thực sự cần, nhưng mặt khác, trong trường hợp của tôi, đó là cả đống công việc ... tiếp ...
Binarus

(gần như tất cả những gì đang chạy) và tôi thậm chí không dám nghĩ đến việc tìm hiểu mối quan hệ giữa các quy trình đang chạy trên hộp (ps -Alf) và các công việc đang kiểm soát các quy trình này; chắc chắn không có mối quan hệ 1: 1. Có những công việc không liên quan đến bất kỳ quy trình nào (ví dụ: định cấu hình mạng) và tôi cho rằng có đủ các quy trình không liên quan đến công việc và đặc biệt là khi bắt đầu mọi thứ theo cách thủ công.
Oli

Upstart thay thế runlevels mã hóa ; theo như tôi có thể xác định, khái niệm runlevel sẽ không biến mất, bây giờ nó chỉ được xác định trong không gian người dùng. Nếu bạn lo lắng về một thời gian dài như vậy, thì bạn muốn sử dụng đề xuất cuối cùng của tôi về việc chạy trên on stopping servicea or stoping serviceb or ...bất kỳ dịch vụ nào bạn cần có để chạy.
geekizard

-1 cho một số điểm không chính xác. Nói thẳng ra, điều này sẽ không thực sự hoạt động. dừng khi bắt đầu RC RUNLEVEL = [016] không khác gì frun 'stop on runlevel [016]'. Điều này là do không sự kiện nào sẽ ngăn chặn việc tắt máy tiếp tục. Ngoài ra còn có cú pháp không hợp lệ, vì 'chạy trên' không hợp lệ. Tất cả trong tất cả điều này chỉ gây nhầm lẫn vấn đề, nó không thực sự giúp đỡ. Xin lỗi vì điều này là quá muộn! Chỉ cần xem lại câu trả lời cũ.
SpamapS

2

Để ngăn việc tắt máy tiếp tục trong khi công việc của bạn dừng lại, bạn sẽ muốn sử dụng điều này:

stop on starting rc RUNLEVEL=[016]

Điều này sẽ hoạt động vì điều đầu tiên xảy ra khi bạn gõ 'shutdown' là tunlevel 0 được phát ra. RC bắt đầu trên runlevel và quá trình chuyển đổi từ dừng -> bắt đầu sẽ chặn hoàn toàn cho đến khi bất kỳ công việc nào cũng phải thay đổi trạng thái hoàn thành trạng thái đó.

Bạn sẽ muốn đảm bảo rằng quy trình của bạn phản hồi nhanh chóng với SIGTERM. Nếu nó không phản hồi trong vòng 5 giây, mới bắt đầu sẽ gửi SIGKILL. Bạn có thể nâng cao điều đó với 'kill timeout X'.

1 trong đó, btw hơi phức tạp, bạn cần chắc chắn rằng khởi đầu của bạn bao gồm một cái gì đó bắt đầu trên runlevel [2345] tại thời điểm đó, để người dùng xuống bảo trì chế độ người dùng duy nhất sẽ bắt đầu lại công việc của họ. May mắn thay, rất nhiều công việc đã đi vào làm cho điều này được đề xuất bắt đầu thông thường

start on runlevel [2345]

Ngoài ra, trong một số trường hợp, bạn cần một cái gì đó để tiếp tục chạy cho đến khi mạng được đưa xuống (chẳng hạn như dbus / trình quản lý mạng). Cho rằng bạn muốn

stop on deconfiguring-networking

Đó là một sự kiện được phát ra sau đó trong quá trình tắt máy cũng sẽ bị chặn cho đến khi bất kỳ công việc nào sử dụng nó hoàn thành quá trình chuyển đổi của chúng ở trạng thái.


Ý bạn là start on starting ... không có ý nghĩa gì khi việc tắt máy móc của tôi dừng lại ở bất cứ điều gì. start on starting rc RUNLEVEL=[016]sẽ có ý nghĩa hơn nhiều. Và có thể taskném vào đó để đảm bảo nó có thể hoàn thành trước khi những thứ khác chạy.
Tejay Cardon

0

Geekizard, cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn.

Trong khi đó, tôi đã thử start on runlevel [016]phương pháp này, nhưng nó không hoạt động và tôi nghĩ tôi hiểu tại sao:

Công việc đã được bắt đầu thực sự, nhưng quá trình tắt máy đã không bị chặn cho đến khi nhiệm vụ hoàn thành. Bây giờ tôi khá chắc chắn rằng các sự kiện startingstoppinglà sự kiện duy nhất có thể được sử dụng trong định nghĩa công việc để chặn các công việc khác và tôi nghĩ rằng đây là những gì hướng dẫn của Upstart cố gắng nói với chúng tôi. Do đó, sử dụng sự kiện runlevel sẽ không bao giờ dẫn đến việc chặn các công việc khác hoặc quá trình tắt máy; do đó, nó là vô dụng cho mục đích của tôi.

Thay vào đó, tôi dường như có hai khả năng:

  1. Theo một trong những đề xuất của bạn, hãy tìm hiểu tất cả các công việc mà các ứng dụng lặp lại cần và bao gồm tất cả chúng trong sự kiện bắt đầu cho kịch bản như thế:

    start on stopping job1 or stopping job2 or ...
    

    Đây là công việc nhiều đến nỗi tôi nghiêm túc nghĩ đến việc từ bỏ danh sách công việc và chạy nó qua sed để tự động tạo ra một khổ thơ cho công việc của tôi, bao gồm tất cả các công việc thường chạy trên hệ thống.

    Ưu điểm là các ứng dụng tương ứng sẽ bị tắt ngay cả khi ai đó dừng một trong những điều kiện tiên quyết bằng tay (trái ngược với việc dừng chúng bằng cách thay đổi / tắt / khởi động lại runlevel).

  2. Tìm một công việc sẽ dừng lại lúc đầu khi khởi động lại / tắt hệ thống (hãy gọi công việc này là "FirstJob") và sử dụng công việc đó trong một khổ thơ như sau:

    start on stopping FirstJob
    

    Nhược điểm chính là tôi không biết liệu một công việc như vậy có tồn tại hay không và liệu công việc đó có thực sự phụ thuộc vào tất cả các công việc khác mà ứng dụng lặp lại thực sự phụ thuộc vào ("phụ thuộc vào công việc khác" trong trường hợp này có nghĩa là "sẽ bị dừng hoàn toàn trước khi công việc khác bắt đầu dừng lại ").

Tôi không chắc cái nào trong hai khả năng là cái tốt hơn ...


Tôi sẽ thực hiện sedkịch bản ngay bây giờ, nếu tôi ở trong đôi giày của bạn.
geekizard
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.