Mặc dù các câu trả lời trước đây ở đây đều đáp ứng yêu cầu về sự hoàn hảo, bạn cũng có thể tắt máy ngay khi hoàn thành nhiệm vụ.
bashtập lệnh có thể là trapped, nghĩa là một số tín hiệu có thể bị chặn và một số tác vụ nhất định có thể được thực thi khi cần. EXITlà một trong những tín hiệu có thể bị mắc kẹt.
Bạn sẽ có thể:
- Đặt
trapcho EXITcác tập lệnh shell tự động của bạn, nghĩa là chấm dứt các tác vụ tự động của bạn
- Đặt
trapcho bạn .bashrc EXIT, nghĩa là bất cứ khi nào bạn đăng xuất khỏi máy đó, tắt nguồn.
Tùy chọn # 1 sẽ là trường hợp lý tưởng, miễn là các nhiệm vụ của bạn không yêu cầu kiểm tra adhoc và phán đoán thủ công.
Tùy chọn # 2 sẽ bao gồm các trường hợp bạn quên thoát khỏi thiết bị đầu cuối mà không tắt nguồn. Có một cảnh báo mặc dù; nếu bạn có nhiều thiết bị đầu cuối cho cùng một máy mở và bạn thoát khỏi một trong số chúng, nó vẫn sẽ tắt nguồn máy như nhau. (Có thể viết kịch bản để tránh điều đó, nhưng tôi sẽ không làm phức tạp hóa giải pháp.)
cleanup(){
# Do some tasks before terminating
echo oh la la, cleaning is so nice
echo "See you later, world"
sudo poweroff & # finally shutdown
}
trap cleanup EXIT
Điều này có thể ở cuối .bashrctùy chọn # 2, ở đâu đó ở đầu tập lệnh của bạn cho tùy chọn # 1.
Tại sao không sử dụng poweroffở cuối tập lệnh?
Tôi thích sử dụng set -eo pipefailở trên cùng của kịch bản của tôi. Nếu có lỗi xảy ra, nó sẽ không âm thầm thất bại; nó sẽ dừng thực thi nhiều lệnh hơn. trapcủa EXITtín hiệu sẽ bao gồm các trường hợp tập lệnh kết thúc sớm do lỗi.
Tuy nhiên, đối với nhiệm vụ của bạn, điều này cũng có nghĩa là máy sẽ tắt trước khi hoàn thành.
Tôi có một bashmẫu đơn giản mà tôi sử dụng để làm cho kịch bản dễ gỡ lỗi hơn; có lẽ nó có thể được sử dụng Xin vui lòng xem ý chính này .
at(thực hiện một lần).