Tin tức và phân tích của tất cả các thiết bị di động

Cách chạy chương trình Linux khi khởi động với systemd

Bạn muốn chạy một chương trình Linux khi khởi động? Phần mềm systemd cho phép bạn thực hiện việc này trên bất kỳ bản phân phối Linux nào có systemd – hầu hết trong số chúng hiện nay, bao gồm cả Ubuntu. Chúng tôi sẽ hướng dẫn bạn quy trình tạo một dịch vụ tích hợp – và thậm chí nói chuyện với tạp chí.

Hướng dẫn này cho biết cách thiết lập dịch vụ hệ thống bắt đầu khi hệ thống khởi động. Để bắt đầu một chương trình đồ họa sau khi đăng nhập, thay vào đó hãy sử dụng trình quản lý khởi chạy máy tính để bàn.

Chạy chương trình khi khởi động

Đôi khi phần mềm bạn cài đặt trên máy tính của bạn cắm vào quá trình khởi động Linux để chương trình được tự động khởi chạy mỗi khi bạn khởi động máy tính. Bạn có thể dễ dàng đạt được hành vi tương tự với các chương trình và tập lệnh của riêng mình hoặc trên thực tế là bất kỳ chương trình nào khác trên máy tính của bạn.

Các chương trình chạy khi khởi động được kiểm soát bởi systemd, tệp hệ thống và trình quản lý dịch vụ. systemd là quá trình đầu tiên bắt đầu khi khởi động. Nó luôn là ID tiến trình (PID) 1. Bất kỳ quy trình nào khác đang chạy trên máy tính đều được khởi động bởi systemd hoặc bởi một quy trình đã được khởi động bởi systemd.

Các chương trình nền được gọi là daemon hoặc dịch vụ. Chữ “d” ở cuối systemd là viết tắt của daemon. Trong bài này, chúng ta sẽ tạo một dịch vụ mẫu. Để đánh dấu vào tất cả các ô, dịch vụ của chúng tôi phải:

Được tích hợp với systemd thông qua tệp đơn vị dịch vụ
Ra mắt khi khởi động
Được điều khiển bằng systemctl, giao diện điều khiển cho systemd
Anh ấy có thể viết nhật ký

Tạo chương trình dịch vụ

Chúng ta cần có một chương trình sẽ chạy systemd. Chúng tôi sẽ tạo một tập lệnh đơn giản có tên “htg.sh”. Hướng dẫn này sử dụng trình soạn thảo văn bản Gedit, nhưng bạn có thể sử dụng bất kỳ trình soạn thảo văn bản nào bạn thích.

touch htg.sh
gedit htg.sh

Trình chỉnh sửa gedit sẽ mở ra. Sao chép và dán văn bản sau vào trình chỉnh sửa.

#!/bin/bash

echo "htg.service: ## Starting ##" | systemd-cat -p info

while :
do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p info
sleep 60
done

Lưu các thay đổi và đóng trình chỉnh sửa.

htg.sh trong gedit

Kịch bản không làm được gì nhiều, nhưng có một vài điểm đáng chú ý.

Hai dòng tiếng vang được dẫn bởi systemd-cat, một chương trình lấy đầu ra từ chương trình và gửi nó vào nhật ký. Các mục nhật ký được ưu tiên. Chúng tôi sử dụng tùy chọn -p (mức độ ưu tiên) để cho biết rằng thông báo của chúng tôi chỉ dành cho mục đích thông tin. Đây không phải là lỗi hoặc cảnh báo quan trọng.
Có một vòng lặp while vô tận.
Biến TIMESTAMP được đặt thành ngày và giờ hiện tại. Điều này được định dạng thành một tin nhắn và gửi đến nhật ký.
Sau đó, tập lệnh ngủ trong 60 giây.
Sau 60 giây, vòng lặp sẽ tự lặp lại. Vì vậy, tập lệnh này ghi lại một tin nhắn có dấu thời gian mỗi phút một lần.

Chúng tôi sẽ sao chép tập lệnh vào thư mục /usr/local/bin.

sudo cp htg.sh /usr/local/bin

Sudo cp htg.sh /usr/local/bin trong cửa sổ đầu cuối

Và chúng ta cần làm cho nó có thể thực thi được:

sudo chmod +x /usr/local/bin/htg.sh

Sudo chmod + x /usr/local/bin/htg.sh trong cửa sổ đầu cuối

Tạo tệp đơn vị dịch vụ

Mọi chương trình được khởi động bởi systemd đều có một tệp định nghĩa được gọi là tệp đơn vị dịch vụ. Nó chứa một số thuộc tính mà systemd có thể sử dụng để định vị và chạy một chương trình cũng như để xác định một số hành vi của nó.

Chúng tôi cần tạo một tệp đơn vị cho dịch vụ mới của mình, nhưng cần thận trọng để đảm bảo rằng không có tệp đơn vị hiện có nào có tên mà chúng tôi muốn đặt cho dịch vụ mới của mình.

sudo systemctl list-unit-files --type-service

Sudo systemctl list-unit-files --type-service trong cửa sổ đầu cuối

Bạn có thể cuộn qua danh sách các tệp đơn vị được sắp xếp theo thứ tự bảng chữ cái và kiểm tra xem tên bạn muốn sử dụng chưa được sử dụng.

Danh sách các tệp đơn vị hệ thống trong cửa sổ đầu cuối

Dịch vụ của chúng tôi sẽ được gọi là “htg.service”. Không có tệp đơn vị nào có tên này, vì vậy chúng tôi có thể tiếp tục và tạo tệp đơn vị của mình.

sudo gedit /etc/systemd/system/htg.service

Sudo gedit /etc/systemd/system/htg.service trong cửa sổ đầu cuối

Trình chỉnh sửa gedit sẽ mở ra. Sao chép và dán văn bản sau vào trình chỉnh sửa:

[Unit]
Description=newsblog.pl Service Example

Wants=network.target
After=syslog.target network-online.target

[Service]
Type=simple
ExecStart=/usr/local/bin/htg.sh
Restart=on-failure
RestartSec=10
KillMode=process

[Install]
WantedBy=multi-user.target

Lưu các thay đổi và đóng trình chỉnh sửa.

đơn vị htg.service trong gedit

Bài dự thi rất quan trọng. Đây là những mục tiêu biểu. Dịch vụ đơn giản của chúng tôi không cần hầu hết chúng, nhưng bao gồm chúng cho phép chúng tôi giải thích chúng.

Mô tả: Đây là mô tả bằng văn bản về tài sản của bạn.
Muốn: Dịch vụ của chúng tôi muốn – nhưng không yêu cầu – kết nối mạng trước khi dịch vụ bắt đầu.
Sau: Danh sách các tên thực thể sẽ được bắt đầu sau khi dịch vụ này bắt đầu thành công, nếu chúng chưa được bắt đầu.
Loại: đơn giản. systemd sẽ coi dịch vụ này được bắt đầu ngay khi quy trình được chỉ định bởi ExecStart được rẽ nhánh.
ExecStart: đường dẫn đến quá trình sẽ được bắt đầu.
Khởi động lại: Khi nào và nếu dịch vụ nên được khởi động lại. Chúng tôi đặt nó thành “trong trường hợp thất bại”.
RestartSec: Thời gian đợi trước khi thử khởi động lại dịch vụ. Giá trị này tính bằng giây.
KillMode: chỉ định cách systemd sẽ hủy tiến trình nếu chúng tôi yêu cầu systemctl dừng dịch vụ. Chúng tôi đã đặt nó thành “đang xử lý”. Điều này khiến systemd chỉ sử dụng tín hiệu SIGTERM trong quy trình chính. Nếu dịch vụ của chúng tôi là một chương trình không tầm thường thay vì một tập lệnh đơn giản, thì chúng tôi sẽ đặt nó thành “hỗn hợp” để đảm bảo tất cả các quy trình đang chạy cũng bị chấm dứt.
WantedBy: Chúng tôi đã đặt tùy chọn này thành “multi-user.target”, có nghĩa là dịch vụ sẽ bắt đầu miễn là hệ thống ở trạng thái mà nhiều người dùng có thể đăng nhập, bất kể có GUI hay không.

Tệp đơn vị không nhất thiết phải thực thi được, nhưng các quyền trên tệp đơn vị sẽ hạn chế người có thể chỉnh sửa tệp đó. Bạn không muốn một người dùng độc hại hoặc độc hại thay đổi một tệp đơn vị để nó thực thi một chương trình hoàn toàn khác.

Lệnh này sẽ cấp cho chủ sở hữu quyền đọc và ghi cũng như quyền đọc đối với nhóm. Những người khác sẽ không có sự cho phép.

sudo chmod 640 /etc/systemd/system/htg.service

Sudo chmod 640 /etc/systemd/system/htg.service trong cửa sổ đầu cuối

Chúng tôi có thể yêu cầu systemctl kiểm tra cú pháp của tệp đơn vị của chúng tôi ngay cả khi dịch vụ chưa được khởi động. Bất kỳ lỗi nào sẽ được báo cáo. (Trên thực tế, phần “.service” là tùy chọn đối với hầu hết các lệnh.)

systemctl status htg.service

status systemctl htg.service trong cửa sổ đầu cuối

Không có lỗi nào được tô sáng, điều đó có nghĩa là tệp đơn vị của chúng tôi đúng về mặt cú pháp.

Bắt đầu dịch vụ

Khi bạn thêm một tệp đơn vị mới hoặc chỉnh sửa tệp hiện có, bạn cần yêu cầu systemd tải lại các định nghĩa tệp đơn vị.

sudo systemctl daemon-reload

Nếu bạn muốn dịch vụ bắt đầu khi khởi động, bạn cần kích hoạt nó:

sudo systemctl enable htg

Kích hoạt dịch vụ không khởi động nó, nó chỉ khiến nó khởi động khi khởi động. Để bắt đầu dịch vụ ngay bây giờ, bạn cần sử dụng systemctl với tùy chọn bắt đầu.

sudo systemctl start htg

Sudo systemctl daemon-reload trong cửa sổ đầu cuối

xác minh dịch vụ

Sau khi khởi động dịch vụ theo cách thủ công hoặc sau khi khởi động lại máy tính, chúng tôi có thể xác minh rằng dịch vụ của chúng tôi đang hoạt động bình thường.

sudo systemctl status htg.service

Sudo systemctl status htg.service trong cửa sổ đầu cuối

Trạng thái dịch vụ được hiển thị cho chúng tôi.

Trạng thái của htg.service trong cửa sổ đầu cuối

Dấu chấm màu xanh lá cây có nghĩa là dịch vụ của chúng tôi đang hoạt động trơn tru.
Tên dịch vụ là “htg.service” và mô tả dài là tên chúng tôi đã cung cấp trong tệp đơn vị.
Chúng tôi được hiển thị tệp đơn vị nào đã được tải “/etc/systemd/system/htg.service”.
Dịch vụ đang hoạt động và chúng tôi có thể nhìn thấy thời điểm ra mắt.
PID của nó là 7762.
Có hai nhiệm vụ liên quan đến dịch vụ.
Dịch vụ sử dụng tổng cộng 928 Kibibyte bộ nhớ.
Nhóm điều khiển chứa tập lệnh “htg.sh” và lệnh ngủ được kích hoạt bởi “htg.sh”. Trong hầu hết các trường hợp, lệnh ngủ sẽ thực hiện công việc cho dịch vụ này.

10 mục nhật ký cuối cùng được tạo bởi dịch vụ này cũng được hiển thị. Không có gì ngạc nhiên khi họ cách nhau một phút.

Dừng và vô hiệu hóa dịch vụ

Nếu bạn muốn dừng dịch vụ, bạn có thể thực hiện bằng lệnh này:

sudo systemctl stop htg.service

Sudo systemctl dừng htg.service trong cửa sổ đầu cuối

Thao tác này sẽ dừng dịch vụ nhưng sẽ không ngăn dịch vụ khởi động lại vào lần tiếp theo bạn khởi động lại máy tính. Để ngăn dịch vụ chạy khi khởi động, bạn cần tắt nó:

sudo systemctl disable htg.service

Sudo systemtctl vô hiệu hóa htg.service trong cửa sổ đầu cuối

Nếu dịch vụ đang chạy, lệnh này sẽ không dừng nó. Nó chỉ yêu cầu systemd không khởi động dịch vụ vào lần khởi động tiếp theo.

Nếu bạn muốn dừng dịch vụ và ngăn dịch vụ bắt đầu khi khởi động, hãy sử dụng cả hai lệnh.

Mẹo dịch vụ

Đảm bảo chương trình hoạt động như mong đợi trước khi thử chạy chương trình dưới dạng dịch vụ.