Thứ năm, 21/08/2014 | 00:00 GMT+7

Hệ thống sự kiện khởi động: Nó là gì và cách sử dụng nó

Khởi tạo là một thủ tục quan trọng nằm ở trung tâm của bất kỳ hệ điều hành dựa trên Unix nào để kiểm soát hoạt động của mọi tập lệnh và dịch vụ. Điều này là cần thiết trong môi trường server , nơi các sự cố có thể xảy ra ở các điểm quan trọng của quá trình khởi động và tắt máy, đồng thời ưu tiên đảm bảo hiệu suất tối ưu.

Về bản chất, việc khởi tạo tuân theo loại quá trình này:

  1. Server khởi động
  2. Quá trình init chạy (thường là PID 1 )
  3. Một tập hợp các việc khởi động được định nghĩa sẽ kích hoạt theo trình tự

Khởi tạo chịu trách nhiệm đảm bảo server cloud có thể khởi động và tắt sạch.

Một số bản phân phối có nền tảng Unix sử dụng quy trình init tiêu chuẩn để khởi tạo. Trong bài viết này, ta sẽ xem xét Upstart - một sự thay thế thiết thực và mạnh mẽ có thể tăng tốc hoạt động của server của bạn.

Có gì sai với init cổ điển?

Khởi tạo truyền thống tuân theo một quy trình tuyến tính: các việc riêng lẻ tải theo một trình tự được định nghĩa khi hệ thống khởi động. Điều này không hữu ích, đặc biệt là trong các tình huống thay đổi nhanh chóng. Để hiểu tại sao, hãy tưởng tượng rằng bạn đã sửa đổi môi trường của server bằng cách thêm một thiết bị lưu trữ bổ sung.

Quá trình khởi tạo không thể tính đến những thay đổi đột ngột trong môi trường, nghĩa là server cloud của bạn sẽ phải được chạy lại trước khi nó có thể nhận ra bộ nhớ bổ sung. Phát hiện nhanh là cần thiết, mặc dù nó không phải là một khả năng của quy trình khởi tạo cổ điển.

Việc khởi động theo trình tự tuyến tính cũng mất thời gian, điều này đặc biệt bất lợi trong môi trường dựa trên cloud , nơi việc triển khai nhanh là điều cần thiết.

Bạn cũng có thể lo lắng về trạng thái các việc của bạn sau khi hệ thống tải xong. Thật không may, init chỉ quan tâm đến trình tự khi bạn đang khởi động hoặc tắt nguồn.

Trình tự khởi động đồng bộ không còn được mong muốn nữa. Một hệ thống cứng nhắc có thể hỗ trợ các hệ thống của ngày hôm qua, nhưng ngày nay thì năng động.

Đó là nơi Upstart xuất hiện - một giải pháp cho những vấn đề này với các khả năng nâng cao.

Dựa trên các sự kiện thời gian thực thay vì danh sách các việc đặt trước theo trình tự, daemon init thay thế này xử lý việc bắt đầu và dừng các việc giám sát các quá trình này trong khi hệ thống đang chạy - "toàn bộ phạm vi" là cách tốt nhất để mô tả nó.

Quá trình xử lý không đồng bộ mới này loại bỏ sự cần thiết của một trình tự khởi động cứng nhắc. Quá trình xử lý theo thời gian thực có thể lộn xộn để lên ý tưởng, nhưng Upstart có thể hỗ trợ hệ thống phức tạp nhất và giữ mọi thứ trong tầm kiểm soát bằng cách sử dụng cấu trúc các công việc .

Tổng quan về Upstart

Logo khởi động

Được thiết kế với sự linh hoạt ngay từ đầu, hệ thống sự kiện Upstart sử dụng nhiều khái niệm khác nhau so với các hệ thống khởi tạo thông thường. Giải pháp được cài đặt theo mặc định trên Red Hat Enterprise Linux (RHEL) 6, cũng như Chrome OS của Google và Ubuntu, mặc dù cuộc tranh luận gần đây đã gây ra sự nhầm lẫn về việc liệu điều này có tiếp tục hay không.

Việc làm

Trong thế giới của Upstart, các công việc là các quy trình làm việc, được chia thành các công việc nhiệm vụ (có mục đích) và công việc dịch vụ (có thể chạy trong nền). Ngoài ra còn có các công việc trừu tượng - các quy trình chạy mãi mãi, cho đến khi user có quyền quản trị dừng lại.

Sự kiện

Tuy nhiên, sự kiện là các tín hiệu hoặc “cuộc gọi” được sử dụng để kích hoạt một hành động nhất định với một công việc hoặc một sự kiện khác.Các dạng sự kiện phổ biến đề cập đến việc giám sát một quá trình: starting , started , stoppingstopped .

Sự kiện phát ra

Quá trình truyền phát một sự kiện được gọi là "phát". Điều này thường do tiến trình hoặc trạng thái công việc gây ra, mặc dù administrator cũng có thể tạo ra một sự kiện theo cách thủ công bằng cách chạy lệnh initctl emit <event> . Bạn sẽ nhận thấy rằng lệnh init control trở nên cực kỳ hữu ích khi chuyển rất nhiều hoạt động liên quan đến Upstart.

Viết cấu hình công việc đầu tiên của bạn

Upstart được biết là hoạt động tốt trên Ubuntu, vì vậy hãy chạy Ubuntu 14.04 Server trước khi bắt đầu.

Đến đây bạn đã sẵn sàng, điều quan trọng là phải hiểu rằng file cấu hình công việc phải tuân theo ba nguyên tắc cơ bản để có hiệu lực.

  • Nó không được để trống (một file không có nội dung)
  • Nó không được chứa bất kỳ lỗi cú pháp nào
  • Nó phải chứa ít nhất một khối lệnh, được gọi là khổ thơ

Bây giờ hãy giữ nó cơ bản. Trong giây lát, ta sẽ tạo một file có tên testjob.conf trong folder /etc/init . Trong trường hợp này, “init” chỉ được dùng làm version rút gọn của “khởi tạo”.

Lưu ý liên kết file .conf - cho biết rằng bạn sẽ viết tệp cấu hình công việc .

Vì mục đích của hướng dẫn này, nên sử dụng nano editor dòng lệnh. Một số lệnh này có thể yêu cầu quyền quản trị với sudo , vì vậy hãy xem bài viết này để tạo user thích hợp.

Để tạo file cấu hình mới cho công việc thử nghiệm của ta , hãy chạy:

sudo nano /etc/init/testjob.conf 

Bây giờ hãy phác thảo mục tiêu. Ta muốn công việc này viết một thông báo và dấu thời gian hiện tại vào một file log .

Có hai khổ thơ cơ bản có thể giúp bạn xác định mục đích của kịch bản công việc và người tạo ra nó: descriptionauthor . Viết những điều này như những dòng đầu tiên của bạn trong file .

description "A test job file for experimenting with Upstart" author "Your Name" 

Bây giờ, ta muốn công việc này diễn ra sau khi các dịch vụ và quy trình hệ thống đã tải xong (để ngăn chặn bất kỳ xung đột nào), vì vậy dòng tiếp theo của bạn sẽ kết hợp sự kiện sau:

start on runlevel [2345] 

Bạn có thể tự hỏi runlevel là gì. Về cơ bản, đó là một giá trị duy nhất đại diện cho cấu hình hệ thống hiện tại. [2345] đề cập đến tất cả các trạng thái cấu hình với mạng và truy cập Linux chung, lý tưởng cho một ví dụ thử nghiệm cơ bản.

Sau đó, ta sẽ thêm mã thực thi. Dòng này bắt đầu bằng chữ thi exec để cho biết các lệnh sau nên được chạy qua shell Bash:

exec echo Test Job ran at  `date` >> /var/log/testjob.log 

Lưu ý lệnh echo này sử dụng dấu gạch ngược để chạy date như một lệnh và sau đó ghi toàn bộ thông báo vào file log . Nếu bạn viết date từ mà không có dấu gạch ngược, bản thân từ đó sẽ được in ra thay vì kết quả của lệnh.

Lưu file này.

Bạn có thể xác minh điều này hoạt động bằng cách bắt đầu công việc theo cách thủ công, nhưng trước tiên hãy kiểm tra cú pháp file cấu hình:

init-checkconf /etc/init/testjob.conf 

Nếu sự cố nào được phát hiện, lệnh này sẽ chỉ ra số dòng cụ thể và sự cố. Tuy nhiên, với công việc thử nghiệm, bạn sẽ thấy kết quả như thế này:

File /etc/init/testjob.conf: syntax ok 

Lệnh này được dùng để kiểm soát công việc Khởi động và các dịch vụ nền khác, chẳng hạn như web server .

Cú pháp lệnh cơ bản là:

sudo service <servicename> <control> 

Cú pháp này hoạt động với các điều khiển cơ bản sau:

  • khởi động lại: điều này sẽ dừng, sau đó bắt đầu một dịch vụ
  • start: điều này sẽ bắt đầu một dịch vụ, nếu nó không chạy
  • dừng: điều này sẽ dừng một dịch vụ, nếu nó đang chạy
  • trạng thái: điều này sẽ hiển thị trạng thái của một dịch vụ

Ta muốn bắt đầu công việc thử nghiệm của bạn theo cách thủ công, vì vậy lệnh sẽ giống như sau:

sudo service testjob start 

Bây giờ, hãy kiểm tra file testjob.log bằng cách chạy lệnh sau:

cat /var/log/testjob.log 

Lệnh này sẽ đọc file vào shell; bạn sẽ thấy một dòng tương tự như dòng bên dưới:

Test Job ran at Fri Aug 1 08:43:05 BST 2014 

Điều này cho thấy rằng công việc thử nghiệm của bạn đã được cài đặt và sẵn sàng hoạt động.

Khởi động lại Server, sau đó đăng nhập và đọc lại file log :

cat /var/log/testjob.log 

Bạn sẽ thấy dòng thứ hai trong log hiển thị dấu thời gian sau đó để xác nhận nó chạy như một công việc Khởi động lại.

Test Job ran at Fri Aug 1 08:44:23 BST 2014 

Điều này chỉ làm xước bề mặt của những gì bạn có thể làm với Upstart. Ta sẽ đề cập đến một ví dụ chi tiết sau, nhưng bây giờ, hãy chuyển sang phần giải thích về các trạng thái và sự kiện công việc.

Trạng thái và sự kiện công việc

Các công việc hệ thống nằm trong folder /etc/init/ và các công việc user nằm trong folder init của chính user , ~/.init/ .

Công việc của user chạy trong phiên của chính user , vì vậy chúng còn gọi là công việc phiên. Chúng không chạy trên toàn hệ thống và không nằm trong chỉ định PID 1 . Với mục đích của công việc thử nghiệm, ta đã sử dụng /etc/init để nó có thể tải khi hệ thống khởi động.

Dù loại của nó là gì, một công việc luôn được xác định trong file cấu hình (.conf) nơi tên file của nó phải đại diện cho dịch vụ hoặc tác vụ liên quan.

Mỗi công việc này đều có một mục tiêu - start hoặc stop . Giữa hai mục tiêu này là một tập hợp các trạng thái nhiệm vụ, xác định các hành động hiện tại của công việc liên quan đến mục tiêu. Các trạng thái quan trọng như sau:

  • chờ đợi: trạng thái xử lý ban đầu
  • bắt đầu: nơi một công việc sắp bắt đầu
  • pre-start: nơi tải phần pre-start
  • sinh sản: nơi một phần tập lệnh sắp chạy
  • hậu bắt đầu: nơi diễn ra các hoạt động hậu bắt đầu
  • đang chạy: nơi công việc hoạt động hoàn toàn
  • dừng trước: nơi các hoạt động dừng trước diễn ra
  • dừng lại: nơi công việc đang bị dừng
  • bị dừng : nơi công việc bị dừng
  • sau dừng: nơi diễn ra các hoạt động sau dừng - để dọn dẹp

Sau trạng thái sau khi bắt đầu, công việc được xác định là đang chạy. Nó sẽ tiếp tục chạy cho đến khi một điểm dừng trước được kích hoạt, nơi công việc sẵn sàng dừng lại, sau đó công việc bị dừng và các quy trình dọn dẹp sau dừng diễn ra, nếu được xác định.

Bạn có thể xem cách một công việc chuyển đổi giữa các trạng thái bằng cách đặt mức độ ưu tiên của log hệ thống Upstart (nằm trong folder /var/log/upstart/ ) để debug bằng lệnh này:

sudo initctl log-priority debug 

Lưu ý trạng thái không phải là sự kiện và sự kiện không phải là trạng thái . Bốn sự kiện (bắt đầu, bắt đầu, dừng và dừng) được phát ra bởi Upstart nhưng các trạng thái nhiệm vụ xác định sự chuyển đổi giữa các giai đoạn trong vòng đời của công việc.

Bây giờ ta đã sẵn sàng chuyển sang một ví dụ tập trung hơn kết hợp các phần tử từ cấu hình đầu tiên của bạn bằng cách viết một lệnh dịch vụ. Điều này sẽ chứng minh cách bạn có thể chuyển đổi từ việc chạy các cấu hình thử nghiệm cơ bản sang các tập lệnh sẵn sàng production .

Ví dụ chuyên sâu: Một công việc dịch vụ

Được đề cập ngắn gọn trong phần giới thiệu, công việc dịch vụ liên quan đến các file cấu hình kịch bản cho phép các quy trình chạy trong nền. Ta sẽ cài đặt một server Node.js cơ bản từ đầu.

Nếu bạn chưa quen với Node, về bản chất, đó là “môi trường đa nền tảng cho các ứng dụng mạng và phía server ” (Wikipedia).

Node.js là một gói rất nhẹ, mặc dù nó không được cài đặt theo mặc định trên Ubuntu 14.04. Để bắt đầu, hãy tiếp tục và cài đặt nó trên server cloud của bạn.

sudo apt-get install nodejs 

Bây giờ, ta hãy bắt đầu với công việc dịch vụ. Tạo một file cấu hình công việc mới trong /etc/init tên là nodetest.conf . Đặt tên cho file có tham chiếu đến mục đích của nó là điều cần thiết, vì vậy bạn có thể nhận ra rằng công việc dịch vụ này là để kiểm tra Node.js.

sudo nano /etc/init/nodetest.conf 

Ta sẽ đề cập đến ứng dụng Node sau trong ví dụ này, vì điều quan trọng là phải hiểu cấu hình Upstart trước.

Điều đầu tiên trước tiên. Bắt đầu bằng lệnh các dòng mô tả công việc và tác giả để xác cấu hình .

description "Service for a test node.js server" author      "Your Name" 

Ta muốn ứng dụng server hỗ trợ Node này khởi động khi server chạy và dừng khi tắt một cách duyên dáng. Do đó, hãy đảm bảo chỉ định cả hai điều kiện:

start on filesystem or runlevel [2345] stop on shutdown 

Nhớ các tiêu chí runlevel trước đó? Kết hợp với sự kiện filesystem , điều này sẽ đảm bảo công việc tải khi server hoạt động bình thường.

Đó là những điều cơ bản, nhưng bây giờ nó trở nên phức tạp hơn; ta sẽ sử dụng các khổ thơ mà ta đã đề cập trước đó.

Vì đây là một ứng dụng server , ta sẽ kết hợp yếu tố ghi log trong cấu hình công việc. Vì ta muốn ghi log khi ứng dụng Node khởi động và dừng, ta sẽ sử dụng ba khổ thơ khác nhau để phân tách các hành động dịch vụ của ta - script , pre-start script pre-stop scriptpre-stop script .

Nếu bạn nghĩ những điều này nghe có vẻ quen thuộc, bạn hoàn toàn đúng. Pre-start và pre-stop là các trạng thái công việc, nhưng chúng cũng hoạt động trong khổ thơ. Điều này nghĩa là các lệnh khác nhau có thể được chạy dựa trên trạng thái của công việc.

Tuy nhiên, khổ thơ đầu tiên cần viết là kịch bản công việc. Thao tác này sẽ nhận được một ID quy trình cho server nền Node và sau đó chạy tập lệnh ứng dụng. Lưu ý thụt lề của các lệnh bên trong một khổ thơ - điều này là cần thiết để định dạng đúng cú pháp.

script      export HOME="/srv"     echo $$ > /var/run/nodetest.pid     exec /usr/bin/nodejs /srv/nodetest.js  end script 

Nút yêu cầu phải đặt biến folder chính, do đó tại sao /srv được xuất trong dòng đầu tiên của khổ thơ. Tiếp theo, $$ được sử dụng để lấy ID quy trình có sẵn và tạo file PID cho công việc của ta . Sau khi đã sẵn sàng, ứng dụng Node.js được tải, ta sẽ viết sau.

Bây giờ là lúc tập trung vào pre-startpre-stop , sẽ được sử dụng để ghi log ứng dụng đơn giản của ta . Ngày, cùng với thông báo bắt đầu hoặc dừng sẽ được thêm vào file log cho công việc của ta :

pre-start script     echo "[`date`] Node Test Starting" >> /var/log/nodetest.log end script 

Lưu ý khổ thơ trước khi dừng có chứa một dòng khác: xóa file PID như một phần của quy trình tắt server (dừng trước thực hiện).

pre-stop script     rm /var/run/nodetest.pid     echo "[`date`] Node Test Stopping" >> /var/log/nodetest.log end script 

Đó là toàn bộ cấu hình công việc Khởi động được sắp xếp; đây là toàn bộ điều để tham khảo:

description "Test node.js server" author      "Your Name"  start on filesystem or runlevel [2345] stop on shutdown  script      export HOME="/srv"     echo $$ > /var/run/nodetest.pid     exec /usr/bin/nodejs /srv/nodetest.js  end script  pre-start script     echo "[`date`] Node Test Starting" >> /var/log/nodetest.log end script  pre-stop script     rm /var/run/nodetest.pid     echo "[`date`] Node Test Stopping" >> /var/log/nodetest.log end script 

Lưu và đóng file .

Như đã đề cập trong exec dòng, một kịch bản Node.js đang chạy từ server , do đó tạo ra một nodetest.js file ở vị trí mong muốn của bạn ( /srv/ được sử dụng trong ví dụ này):

sudo nano /srv/nodetest.js 

Vì đây là hướng dẫn Khởi động nên ta sẽ không mất quá nhiều thời gian để xem lại mã Node.js, mặc dù đây là tóm tắt về những gì tập lệnh này sẽ thực hiện:

  • Yêu cầu và tải module HTTP của Node
  • Tạo một web server HTTP
  • Cung cấp phản hồi trạng thái 200 (OK) trong Tiêu đề
  • Viết "Hello World" dưới dạng kết quả
  • Nghe trên cổng 8888

Đây là mã bạn cần để chạy ứng dụng Node, có thể được sao chép trực tiếp để tiết kiệm thời gian:

var http = require("http");  http.createServer(function(request, response) {     response.writeHead(200, {"Content-Type": "text/plain"});     response.write("Hello World");     response.end(); }).listen(8888); 

Sau khi lưu file Node.js, điều cuối cùng cần kiểm tra là cú pháp công việc Upstart có hợp lệ hay không. Như thường lệ, hãy chạy lệnh kiểm tra cấu hình và bạn sẽ nhận được xác nhận là kết quả :

init-checkconf /etc/init/nodetest.conf   File nodetest.conf: syntax ok 

Bạn đã có cấu hình công việc, kiểm tra cú pháp của nó và lưu mã Node.js - mọi thứ đã sẵn sàng, vì vậy hãy khởi động lại Server và sau đó truy cập http: // IP: ** 8888 ** hoặc domain được liên kết.

Nếu bạn gặp “Hello World” ở góc trên bên trái của cửa sổ, công việc dịch vụ Upstart đã hoạt động!

Để xác nhận việc ghi log dựa trên trạng thái, hãy đọc file log được định nghĩa và bạn sẽ thấy dòng Starting dấu thời gian. Việc tắt server hoặc dừng Công việc Dịch vụ theo cách thủ công sẽ ghi dòng Stopping vào log , bạn cũng có thể kiểm tra nếu muốn.

cat /var/log/nodetest.log  [Sun Aug 17 08:08:34 EDT 2014] Node Test Starting [Sun Aug 17 08:13:03 EDT 2014] Node Test Stopping 

Bạn có thể chạy các lệnh starndard start, stop, restart, v.v. cho dịch vụ này và bất kỳ công việc Upstart nào tương tự khác, với cú pháp như sau:

sudo service nodetest restart 

Kết luận

Hướng dẫn này chỉ làm xước bề mặt của Hệ thống sự kiện khởi động. Bạn đã đọc nền tảng về khởi tạo truyền thống, tìm hiểu lý do tại sao giải pháp Upstart open-souce là một lựa chọn mạnh mẽ hơn và bắt đầu viết công việc của bạn . Đến đây bạn đã biết những điều cơ bản, khả năng là vô tận.

Logo từ trang web chính thức của Upstart, bản quyền nhà thiết kế root / Canonical Ltd.


Tags:

Các tin liên quan