1. Khái quát chung
Trong hướng dẫn nhanh này, chúng ta sẽ khám phá các tùy chọn khác nhau để thực thi tập lệnh khi khởi động trong Linux. Điều này rất hữu ích trong nhiều trường hợp, chẳng hạn như nếu chúng ta muốn tự động khởi động một ứng dụng máy chủ.
2. Giải pháp
Hãy tạo một tập lệnh đơn giản để thực thi:
#!/bin/sh
echo "Last reboot time: $(date)" > /etc/motd
Đoạn mã này đặt thông báo trong ngày là lần khởi động lại cuối cùng để mỗi người dùng có thể nhìn thấy nó sau lần đăng nhập đầu tiên.
Sau đó, chúng tôi sẽ lưu tệp của mình và làm cho nó có thể thực thi được:
$ chmod +x reboot_message.sh
Bây giờ tập lệnh của chúng ta đã sẵn sàng, hãy xem cách lên lịch thực hiện nó.
2.1. Sử dụng cron
Hãy bắt đầu với giải pháp đơn giản nhất, liên quan đến việc sử dụng cron . Để thực hiện việc này, chúng ta cần chỉnh sửa tệp crontab của mình:
$ crontab -e
Ở đây, chúng tôi sẽ thêm một dòng bằng biểu thức @reboot , biểu thức này sẽ thực thi mã của chúng tôi một lần khi khởi động:
@reboot sh /home/ec2-user/reboot_message.sh
Giải pháp này nhanh chóng và rõ ràng vì chúng ta không phải xử lý cấu hình bổ sung, nhưng không phải mọi phiên bản cron đều hỗ trợ @reboot .
2.2. Sử dụng rc.local
Bây giờ hãy xem xét một giải pháp khác tận dụng tệp /etc/rc.d/rc.local . Vì tệp này đã chạy khi khởi động nên chúng tôi có thể nối thêm một dòng gọi tập lệnh của mình:
sh /home/ec2-user/reboot_message.sh
Để tính năng này hoạt động, chúng ta cần đảm bảo rằng chính tệp rc.local có thể thực thi được :
$ chmod +x /etc/rc.d/rc.local
2.3. Sử dụng init.d
Tương tự như giải pháp trước đó, thư mục /etc/init.d chứa các tệp thực thi vòng đời của các dịch vụ do hệ thống quản lý. Chúng tôi cũng có thể thêm trình bao bọc của riêng mình bằng cách tạo trình LSB-compliant wrapper để khởi động dịch vụ của mình:
#! /bin/sh
# chkconfig: 345 99 10
case "$1" in
start)
# Executes our script
sudo sh /home/ec2-user/reboot_message.sh
;;
*)
;;
esac
exit 0
Wrapper này sẽ khởi chạy mã của chúng ta khi nó được gọi bằng đối số bắt đầu . Tuy nhiên, chúng ta phải bao gồm một dòng có cấu hình chkconfig , chứa dịch vụ runlevel và mức độ ưu tiên start/stop.
Sau khi đặt wrapper vào thư mục init.d , chúng ta cần đăng ký dịch vụ của mình để thực thi khởi động:
$ chkconfig --add service_wrapper.sh
Vì lệnh chkconfig không có sẵn trên hệ thống Debian nên update-rc.d có thể được sử dụng thay thế ở đó:
$ update-rc.d service_wrapper.sh defaults
2.4. Sử dụng hệ thống
Cuối cùng, hãy xem cách chạy tập lệnh với systemd . Tương tự như init.d , chúng ta cần tạo một bộ mô tả dịch vụ, được gọi là unit file, trong /etc/systemd/system :
[Unit]
Description=Reboot message systemd service.
[Service]
Type=simple
ExecStart=/bin/bash /home/ec2-user/reboot_message.sh
[Install]
WantedBy=multi-user.target
Tệp được tổ chức thành các phần khác nhau:
- Unit – chứa siêu dữ liệu chung, như mô tả mà con người có thể đọc được
- Service – mô tả quy trình và hành vi trình bày, cùng với lệnh khởi động dịch vụ
- Install – cho phép dịch vụ chạy khi khởi động bằng thư mục được chỉ định trong WantedBy để xử lý các phần phụ thuộc
Tiếp theo, chúng tôi sẽ cần đặt quyền đối với tệp thành 644 và kích hoạt dịch vụ của chúng tôi bằng cách sử dụng systemctl :
$ chmod 644 /etc/systemd/system/reboot_message.service
$ systemctl enable reboot_message.service
Một điều cần lưu ý là, mặc dù nhiều bản phân phối chính hỗ trợ systemd nhưng không phải lúc nào nó cũng có sẵn.
3. Kết luận
Trong bài viết này, chúng ta đã xem xét các cách khác nhau để thực thi tập lệnh khi khởi động trong Linux. Mỗi cái trong số chúng đều có ưu và nhược điểm, nhưng nói chung, systemd và cron nên được ưu tiên khi có sẵn. Do đó, nên sử dụng rc.local và init.d làm dự phòng.