Có bao nhiêu cách chạy ứng dụng khi khởi động thì có bấy nhiêu cách chạy ứng dụng một lần duy nhất trong lần khởi động tới.
Trước hết soạn tập tin bash /root/runonce.sh để gọi các lệnh theo nhu cầu
cat <<EOF > /root/runonce.sh
### your commands here
sleep 5
apt update && apt -y upgrade > /root/log
apt install -y mc tmux >> /root/log
### end commands
EOF
Sau đó tìm cách gọi chạy rồi hủy lệnh đi
- Dùng /etc/rc.local
# /etc/rc.local
...
# RUN_ONCE
/bin/bash /root/runonce.sh
sed -i '/RUN_ONCE/,/END_RUN_ONCE/d' /etc/rc.local
# END_RUN_ONCE
exit 0
- Dùng crontab
# cat <<EOF > /etc/cron.d/runonce
@reboot root /bin/bash /root/runonce.sh; /bin/rm -f /etc/cron.d/runonce
EOF
Trong cách dùng rc.local, tập tin bị xóa mất 4 dòng nên lệnh exit 0 cuối cùng không thể thi hành, tuy nhiên runonce.sh đã thi hành xong.
Tương tự, trong cách dùng crontab, tập tin cron runonce bị xóa khi kết thúc, runonce.sh không được gọi chạy trong lần khởi động tiếp theo.
Trong mọi trường hợp, để chờ kết nối internet thì phải thêm lệnh sleep 5 (5 giây). Nếu muốn cài đặt app hay cần chạy lệnh trong môi trường OS đầy đủ thì nên tạo service.
- Tạo service runone
# cat <<EOF > /etc/systemd/system/runonce.service
[Unit]
Description=Run script once on next boot
[Service]
Type=oneshot
ExecStart=/usr/bin/bash /root/runonce.sh
ExecStop=/usr/bin/rm /root/runonce.sh
ExecStop=/usr/bin/rm -f /etc/systemd/system/multi-user.target.wants/runonce.service
ExecStop=/usr/bin/rm -f /etc/systemd/system/runonce.service
ExecStop=/usr/bin/systemctl daemon-reload
[Install]
WantedBy=multi-user.target
EOF
# ln -s /etc/systemd/system/runonce.service /etc/systemd/system/multi-user.target.wants/runonce.service
Chú thích
- Kiểm tra kỹ các lệnh gọi chạy qua service runonce. Một lệnh gặp lỗi sẽ khiến các lệnh tiếp theo không được gọi chạy.
- Cách dùng crontab có vẻ đơn giản và an toàn.