Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Linux

Cách quản lý khởi động dịch vụ và script trên CentOS/RHEL

Trong bài viết này, chúng ta sẽ tìm hiểu cơ bản về cách cấu hình dịch vụ và script tự động khởi động trong Linux CentOS/RHEL 7/8. Cụ thể, chúng ta sẽ làm quen với daemon systemd, học cách thêm dịch vụ vào hoặc loại bỏ khỏi khởi động, và xem xét các cách替代 để khởi động script hoặc daemon khi boot Linux.

Bài viết nhằm giúp bạn nhanh chóng tìm danh sách dịch vụ hoặc script tự động khởi động trong Linux, thêm dịch vụ hoặc script của mình vào khởi động, hoặc tắt khởi động tự động của một số ứng dụng.

Sử dụng Systemctl để quản lý dịch vụ Systemd trong Linux

Hầu hết các bản phân phối Linux phổ biến (CentOS, RHEL, Debian, Fedora, Ubuntu) sử dụng daemon khởi động systemd thay vì init.d. Systemd là trình quản lý dịch vụ Linux được dùng để khởi động và quản lý các daemon khác. Nó sử dụng các file unit từ /etc/systemd/system (trong khi init.d dùng script từ /etc/init.d/). Systemd cho phép song song hóa việc khởi động dịch vụ khi boot hệ điều hành.

Để quản lý systemd, lệnh systemctl được sử dụng.

Trước tiên, sau khi boot hệ thống, chúng ta sẽ kiểm tra danh sách các unit có sẵn trong systemd:

systemctl list-units

Cách quản lý khởi động dịch vụ và script trên CentOS/RHEL

Bạn có thể lấy danh sách file unit bằng lệnh:

systemctl list-unit-files

Lệnh này sẽ hiển thị tất cả các file unit có sẵn.

Để hiển thị danh sách dịch vụ đang hoạt động và trạng thái của chúng, chạy lệnh:

# systemctl list-units -t service

Vì một số unit có thể trở nên không hoạt động sau khi khởi động, bạn có thể lấy danh sách đầy đủ bằng tùy chọn --all.

# systemctl list-units --all
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active waiting ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
● exim.service not-found inactive dead exim.service
firewalld.service loaded active running firewalld - dynamic firewall daemon
getty@tty1.service loaded active running Getty on tty1
● iptables.service not-found inactive dead iptables.service
Bring up/down networking
● NetworkManager-wait-online.service not-found inactive dead

Như bạn thấy từ danh sách, ngay cả các dịch vụ không tìm thấy trên đĩa cũng được hiển thị.

Ngoài ra, bạn có thể dùng các cờ khác, ví dụ:

  • --state — dùng để xác định trạng thái daemon: Load, Active, Sub
  • --type — cho phép lọc unit theo loại

Ví dụ:

systemctl list-units --all --state=active — chỉ hiển thị danh sách unit systemd đang hoạt động

systemctl list-units --type=service — hiển thị danh sách các unit là dịch vụ

Cách quản lý khởi động dịch vụ và script trên CentOS/RHEL

Cách tạo dịch vụ trong Systemd?

Để quản lý dịch vụ, systemd sử dụng cú pháp đặc biệt. Bạn phải thêm .service sau tên dịch vụ. Ví dụ:

# systemctl enable nginx.service — lệnh thêm máy chủ web nginx vào khởi động

Lệnh này sẽ tạo một symbolic link đến file được chỉ định trong lệnh dịch vụ trong thư mục khởi động của systemd.

# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service

Đầu ra của lệnh hiển thị thư mục nơi symlink đến file dịch vụ đã được tạo.

Để kiểm tra xem dịch vụ đã được thêm vào khởi động chưa, bạn có thể lấy trạng thái của nó:

systemctl status nginx.service

Chú ý dòng sau trong đầu ra:

Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)

Giá trị enabled nghĩa là dịch vụ này đã được thêm vào khởi động Linux. Nếu dịch vụ không tự động khởi động, bạn sẽ thấy disabled.

Cách tắt dịch vụ trong Systemd?

Bạn có thể loại bỏ dịch vụ khỏi khởi động để nó không tự chạy khi boot Linux (trong khi chính dịch vụ không bị xóa). Để tắt khởi động tự động của dịch vụ, chạy lệnh:

# systemctl disable your_service

Ví dụ, để tắt tự động khởi động nginx:

# systemctl disable nginx.service
Removed symlink /etc/systemd/system/multi-user.target.wants/nginx.service

Sau khi làm vậy, symlink đến file dịch vụ sẽ bị xóa khỏi thư mục systemd. Bạn có thể kiểm tra xem dịch vụ có tự động khởi động không:

# systemctl is-enabled nginx

Cách Mask Unit với Systemd?

Tôi từng gặp một số dịch vụ "quái" vẫn còn ở trong khởi động sau khi tắt chúng và vẫn khởi động sau khi reboot Linux. Để giải quyết vấn đề này, bạn có thể mask dịch vụ:

# systemctl mask nginx.service

Sau đó nó sẽ không khởi động được cả thủ công lẫn sau khi restart hệ điều hành:

# systemctl mask nginx.service
Created symlink from /etc/systemd/system/nginx.service to /dev/null.
# service nginx restart
Redirecting to /bin/systemctl restart nginx.service
Failed to restart nginx.service: Unit is masked.

Bạn có thể unmask dịch vụ bằng lệnh:

# systemctl unmask nginx.service
Removed symlink /etc/systemd/system/nginx.service.

Nếu sau khi mask dịch vụ bạn kiểm tra file unit, bạn sẽ thấy dịch vụ được đánh dấu là masked:

Cách quản lý khởi động dịch vụ và script trên CentOS/RHEL

Chạy Script hoặc Dịch vụ với Rc.local

Để chạy các script khác nhau khi boot Linux, rc.local thường được dùng.

Ngoài script, dùng rc.local bạn cũng có thể chạy dịch vụ, kể cả những dịch vụ được khởi động bằng systemd. Tôi không biết tại sao bạn nên dùng rc.local nếu đã có systemd, nhưng đây là vài ví dụ.

Trước hết, /etc/rc.local phải có quyền thực thi:

chmod +x /etc/rc.local

Rc.local phải được thêm vào tự động khởi động của systemd:

systemctl enable rc-local

Và chúng ta có thể thêm lệnh khởi động máy chủ web nginx vào rc.local:

service nginx start

Cách quản lý khởi động dịch vụ và script trên CentOS/RHEL

Nhưng tôi hiếm khi dùng rc.local để khởi động dịch vụ. Thường rc.local dùng để chạy script hoặc lệnh một lần.

Ví dụ, tôi tạo script /root/test.sh làm gì đó và muốn chạy nó ngay sau khi boot. Thêm dòng sau vào file rc.local:

sh /root/test.sh

Cách quản lý khởi động dịch vụ và script trên CentOS/RHEL

Từ CentOS 7, các nhà phát triển chỉ ra rằng rc.local là một daemon lỗi thời và không khuyến khích dùng nó để khởi động script hoặc dịch vụ. Nhưng tôi vẫn dùng nó vì nó rất đơn giản.

Cách tạo dịch vụ Linux với Systemd?

Bạn có thể tạo daemon riêng và quản lý nó qua systemd.

Ví dụ, bạn muốn chạy cùng một script (/root/test.sh) mỗi khi hệ thống reboot. Hãy bắt đầu bằng việc tạo file dịch vụ mới:

touch /etc/systemd/system/test-script.service
chmod 664 /etc/systemd/system/test-script.service
nano /etc/systemd/system/test-script.service

Nội dung file như sau:

[Unit]
Description=Template Settings Service
After=network.target

[Service]
Type=oneshot
User=root
ExecStart=/root/test.sh

[Install]
WantedBy=multi-user.target

Các tham số chính:

  • User — tài khoản người dùng daemon được chạy từ đó
  • Type=oneshot — systemd sẽ chờ tiến trình kết thúc trước khi tiếp tục với các unit khác

Kiểm tra và khởi động nó:

# systemctl daemon-reload
# systemctl start test-script.service
# systemctl status test-script.service
● test-script.service - Test
Loaded: loaded (/etc/systemd/system/test-script.service; disabled; vendor preset: disabled)
Active: active (running)

Nếu dịch vụ hoạt động tốt, thêm nó vào khởi động systemd:

# systemctl enable test-script.service
Created symlink from /etc/systemd/system/multi-user.target.wants/test-script.service to /etc/systemd/system/test-script.service.

Như vậy, bạn có thể thêm bất kỳ script nào vào tự động khởi động và quản lý chúng thông qua systemd.

Cách chạy Script bằng Cron?

Nếu bạn muốn chạy script hoặc lệnh theo một tần suất nhất định, bạn có thể dùng cron:

crontab -e — mở trình chỉnh sửa để thay đổi bảng tác vụ cron

Và thêm tác vụ bạn muốn, ví dụ:

* * * * * /root/test.sh — chạy script mỗi phút.

Bạn có thể viết một script watch-dog kiểm tra trạng thái dịch vụ, và nếu dịch vụ không chạy, script sẽ khởi động nó. Tôi đang dùng cách tương tự trong một số dự án.

Để hiển thị danh sách tất cả tác vụ trong cron, chạy lệnh:

# crontab -l
* * * * * /root/test.sh

Các giá trị thời gian có sẵn để chạy tác vụ cron theo thứ tự:

  • Phút: 0-59
  • Giờ: 0-59
  • Ngày trong tháng: 1-31
  • Tháng: 1-12
  • Ngày trong tuần: 0-7 (0 hoặc 7 là Chủ nhật)

Trong tác vụ của chúng ta, script chạy mỗi phút, nên có dấu *asterisk*.

Bạn cũng có thể đặt script vào một trong các thư mục cron:

  • /cron.daily — cho script chạy một lần mỗi ngày
  • /cron.hourly — cho script chạy một lần mỗi giờ
  • /cron.monthly — cho script chạy một lần mỗi tháng
  • /cron.weekly — cho script chạy một lần mỗi tuần

Các script trong các thư mục chỉ định sẽ được chạy theo lịch tự động.

Script khởi động Bash: .bashrc

Nếu bạn muốn thực hiện một số hành động khi khởi động console SSH, bạn có thể thêm bất kỳ lệnh hoặc script nào vào file .bash_profile hoặc .bashrc. Về lý thuyết, bạn có thể thêm hành động vào bất kỳ file nào trong số này, nó sẽ được chạy trong mọi trường hợp. Thường thì những thứ bạn cần được thêm vào .bashrc, và .bashrc được khởi động từ .bash_profile.

Tôi thêm lệnh khởi động lại dịch vụ web nginx vào file .bashrc:

service nginx restart

Cách quản lý khởi động dịch vụ và script trên CentOS/RHEL

Sau đó tôi lưu file và khởi động lại phiên SSH:

Cách quản lý khởi động dịch vụ và script trên CentOS/RHEL

Như bạn thấy, khi khởi động terminal, máy chủ web cũng đã được khởi động lại. Những hành động nào có thể thực hiện khi khởi động terminal? Có thể là một số công cụ bổ sung, như kiểm tra uptime máy chủ:

Cách quản lý khởi động dịch vụ và script trên CentOS/RHEL

Hoặc nếu bạn muốn truy cập vào thư mục cụ thể và khởi động mc khi chạy console ssh, thêm sau vào .bashrc:

cd /var/
mc

Cách quản lý khởi động dịch vụ và script trên CentOS/RHEL

Hy vọng bài viết về cách quản lý khởi động dịch vụ hoặc script trong Linux đã hữu ích cho bạn (bài viết này dành cho CentOS và RHEL, nhưng phù hợp với các bản phân phối khác). Tôi chắc chắn thông tin này sẽ tiện lợi cho những người đang học أساس quản trị hệ thống Linux.