Nếu bạn cần tạo một tác vụ hoặc chương trình tự động bắt đầu thực thi mỗi khi bạn khởi động hệ thống của mình, bạn có thể cân nhắc tạo một dịch vụ mới. Hãy tìm hiểu cách tạo một dịch vụ systemd mới tùy chỉnh trên Linux.
Bước 1: Tạo tệp dịch vụ
Có một số bước cần thiết để tạo tệp dịch vụ systemd mới. Việc đầu tiên là tạo tệp đơn vị (unit file) cho dịch vụ. Trước khi bạn tạo một tệp dịch vụ, bạn phải hiểu cấu trúc của nó.
Hãy nghiên cứu tệp dịch vụ bằng cách lấy một tệp dịch vụ thực, đang hoạt động từ hệ thống Linux của bạn. Bên dưới, bạn có thể xem tệp dịch vụ cho dịch vụ daemon vmtools.
Dịch vụ này có thể không có trên hệ thống của bạn. Điều này không quan trọng vì tất cả các tệp đơn vị dịch vụ, có cùng cấu trúc cơ sở với một số tùy chỉnh theo yêu cầu.
Tất cả các tệp dịch vụ systemd phải có ba phần: [Service], [Unit] và [Install] và một vài tham số trong mỗi phần. Đây là những gì bên trong mỗi phần:
1. Unit
Phần Unit bao gồm siêu dữ liệu quan trọng như mô tả và các thành phần phụ thuộc của dịch vụ. Nó có ba tham số: Description, Before và After. Tham số Description cung cấp một số ngữ cảnh của dịch vụ và chức năng của nó.
Các tham số Before và After xác định các điều kiện cần đáp ứng để dịch vụ thực thi. Ví dụ: nếu bạn đang bắt đầu một dịch vụ máy chủ web, bạn muốn nó chỉ bắt đầu sau khi dịch vụ mạng online. Vì vậy, bạn sẽ đặt giá trị của tham số After cho dịch vụ mạng.
2. Service
Phần Service chứa hai tham số bắt buộc: ExecStart, Type và một số tham số tùy chọn khác như ExecReload , v.v.
ExecStart xác định lệnh sẽ được thực thi khi dịch vụ bắt đầu còn tham số Type xác định loại quy trình sẽ xuất hiện.
3. Install
Phần này và dữ liệu của nó được gọi bất cứ khi nào bạn bật hoặc tắt dịch vụ bằng lệnh systemctl.
Nó có một vài tham số. Một trong những tham số phổ biến là WantedBy. Tham số này xác định các đơn vị mục tiêu sẽ bắt đầu bất cứ khi nào dịch vụ được bật. Giá trị mặc định là multi-user.target .
Lưu ý: Các tham số được nhắc đến ở đây không phải là các tham số duy nhất bạn có thể đặt trong tệp đơn vị. Bạn có thể lấy danh sách đầy đủ các tham số từ tài liệu systemd.exec chính thức hoặc bằng cách gõ man systemd.exec trong một terminal.
Tệp đơn vị dịch vụ systemd luôn kết thúc bằng phần mở rộng “.service ” và phải được lưu trữ trong thư mục /etc/systemd/system/. Tạo tệp dịch vụ bằng lệnh touch với các đặc quyền nâng cao bằng cách thêm tiền tố vào nó bằng lệnh sudo:
sudo touch /etc/systemd/system/<filename>.service
Bây giờ bạn đã tạo tệp dịch vụ, hãy bắt đầu điền cú pháp cần thiết để làm cho dịch vụ hợp lệ và hoạt động.
Bước 2: Định cấu hình tệp dịch vụ
Để trình diễn, bạn sẽ tạo một dịch vụ mẫu thực thi Nmap để quét các cổng trên máy của bạn và lưu kết quả đầu ra trong một tệp 30 giây một lần. Để đạt được nhiệm vụ này, đây là cách cấu trúc tệp đơn vị dịch vụ:
[Unit]
Description=Demonstration of custom nmap service.
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/bin/nmap -sS -O -oN /home/<user>/results.txt localhost
Restart=always
RestartSec=30
[Install]
WantedBy=multi-user.target
Mặc dù các tham số được nhắc đến ở đây đã được giải thích trước đây, nhưng chúng ta hãy tìm hiểu xem chúng ảnh hưởng như thế nào đến dịch vụ mới tạo và cũng khám phá những tham số mới được giới thiệu trong phần này: Restart, RestartSec và User.
Dưới đây là ý nghĩa của các tham số trong mỗi phần:
- Description: Văn bản mà con người có thể đọc được để mô tả các chức năng của dịch vụ.
- After=network.target: Ra lệnh cho systemd rằng dịch vụ này phụ thuộc vào network.target và chỉ nên bắt đầu sau khi dịch vụ network.target đã được khởi động. Lưu ý rằng After không được dùng để thiết lập bất kỳ mối quan hệ phụ thuộc trực tiếp nào, nó chỉ hoạt động như một kích hoạt (trigger).
- Type=simple: Có nhiều loại dịch vụ. Tuy nhiên, dịch vụ trong minh họa này là một quy trình thông thường và do đó chúng tôi tuyên bố nó như vậy. Bạn có thể tìm thấy tất cả các giá trị khác nhau cho điều này trên trang tài liệu chính thức được dẫn ở trên.
- Restart=always: Điều này có nghĩa là bất cứ khi nào dịch vụ thoát, dịch vụ sẽ luôn khởi động lại.
- RestartSec=30: Điều này đặt khoảng thời gian giữa mỗi lần bắt đầu dịch vụ thành 30 giây.
- User=root: Điều này xác định rằng dịch vụ sẽ chạy với tư cách là người dùng root. Trong trường hợp này, đây là bước phải làm vì Nmap sẽ không thể chạy nếu không có quyền root.
- ExecStart: Lệnh này giữ đường dẫn tuyệt đối đến chương trình sẽ được thực thi cùng với tất cả các cờ (flag) bắt buộc hoặc đối số cần thiết để chương trình hoạt động bình thường.
- WantedBy=multi-user.target: Tham số này trong tệp dịch vụ chỉ định mục tiêu nào sẽ bao gồm hoặc “muốn” dịch vụ. Khi một dịch vụ được bao gồm trong một mục tiêu, điều đó có nghĩa là dịch vụ đó sẽ bắt đầu khi hệ thống đạt đến mục tiêu đó trong quá trình khởi động. Trong trường hợp này, dịch vụ sẽ bắt đầu khi hệ thống chuyển sang chế độ nhiều người dùng. Chế độ nhiều người dùng là trạng thái hệ thống được khởi động hoàn toàn và cho phép nhiều người dùng đăng nhập và sử dụng hệ thống.
Bước 3: Kích hoạt và bắt đầu dịch vụ
Bây giờ bạn đã tạo tệp đơn vị, các bước còn lại để kích hoạt dịch vụ của bạn là kích hoạt và chạy nó. Bạn có thể kích hoạt và bắt đầu dịch vụ của mình bằng lệnh systemctl.
Đây là cách sử dụng systemctl để bật, bắt đầu và kiểm tra trạng thái dịch vụ của bạn:
sudo systemctl enable <filename>.service
sudo systemctl start <filename>.service
sudo systemctl status <filename>.service
Bây giờ, dịch vụ tùy chỉnh của bạn sẽ được thiết lập và chạy! Trong trường hợp này, bạn sẽ thấy quét Nmap chạy ba mươi giây một lần và đầu ra được lưu trữ trong tệp results.txt trong thư mục chính.
Thiết lập Dịch vụ systemd trên Linux rất dễ dàng!
Mặc dù thiết lập một dịch vụ tùy chỉnh từ đầu nghe có vẻ khó khăn nhưng đó là một cách khá dễ dàng để thiết lập một quy trình không cần giám sát để thực hiện các nhiệm vụ lặp đi lặp lại cho bạn.
Trong bài viết này, chúng ta mới chỉ tìm hiểu sơ qua về cách định cấu hình và thiết lập dịch vụ. Để tìm hiểu sâu hơn về cách bạn có thể tùy chỉnh dịch vụ của mình, bạn nên tham khảo tài liệu systemd.exec chính thức.
Tìm hiểu ngay chương trình học công nghệ thông tin trực tuyến tại FUNiX ở đây:
Vân Nguyễn
Dịch từ: https://www.makeuseof.com/create-systemd-service-on-linux/












Bình luận (0
)