Điểm:1

Ubuntu 20.04 â chạy tập lệnh khi tắt máy/khởi động lại

lá cờ pe

Tôi đang cố chạy tập lệnh khi tắt máy và khởi động lại nhưng không thành công. Tôi có một tập lệnh để chạy với quyền root khi khởi động và nó hoạt động tốt: lưu trữ tập lệnh trong /etc/init.d, tạo một liên kết tới nó trong /etc/rc2.d bắt đầu với S99 và làm cho nó có thể thực thi được. Sau một số nghiên cứu, tôi đã làm điều tương tự với tập lệnh tắt máy tạo liên kết trong /etc/rc0.d và /etc/rc6.d, làm cho nó có thể thực thi được và bắt đầu đặt tên liên kết bằng âK99myscriptâ nhưng tập lệnh không chạy. Tôi đã thử đổi tên liên kết thành âK00myscriptâ để chạy trước những tên khác, thay đổi từ sh thành bash (#! /bin/sh thành #! /bin/bash) nhưng dường như không có tác dụng gì. Tôi đang chạy Xubunto và sử dụng systemctl poweroffâ để tắt máy và systemctl rebootâ để khởi động lại. Đây có phải là một phương pháp lỗi thời?

Tôi cũng đã thử tạo một .service trong /etc/systemd/system như đề xuất:

[Đơn vị]
Mô tả=Quy trình trước khi tắt máy
Phụ thuộc mặc định = không
Trước = tắt máy.đích khởi động lại.đích tạm dừng.đích kexec.đích

[Dịch vụ]
Loại=oneshot
Người dùng = root
Nhóm = gốc
ExecStart=/etc/init.d/myscript

[Cài đặt]
WantedBy=shutdown.đích khởi động lại.đích tạm dừng.đích kexec.đích

Cả có và không có trường Người dùng/Nhóm nhưng nó không hoạt động ...

sudodus avatar
lá cờ jp
Tại sao việc chạy tập lệnh khi tắt máy lại quan trọng? Nó có đủ để chạy tất cả các tập lệnh khi khởi động (khởi động nguội cũng như khởi động lại) không? Trong trường hợp đó, bạn có thể sử dụng `@reboot` trong `crontab`.
FedKad avatar
lá cờ cn
Điều này có trả lời câu hỏi của bạn không? [Cách chạy lệnh TRƯỚC KHI tắt máy trên Ubuntu 21.04](https://askubuntu.com/questions/1335022/how-to-run-a-command-b Before-shutdown-on-ubuntu-21-04)
lá cờ pe
Ở cấp độ người dùng, sẽ dễ dàng thực hiện một số tác vụ khi tắt máy, khởi động lại, đăng xuất… XFCE có một GUI đẹp cho việc đó chỉ với các tệp .desktop. Nhưng tôi cần phải thực hiện chúng với quyền root. Phương thức dịch vụ systemd không hoạt động ngay cả khi chỉ định Người dùng và Nhóm là gốc. Nhưng tôi đã tìm thấy một số manh mối thú vị ở đây: [18.04 - thiếu insserv trên Ubuntu 18 ](https://askubuntu.com/questions/1048330/insserv-missing-on-ubuntu-18) Mặc dù tôi phải nghiên cứu thêm một chút về nó và hiểu cách cấu hình tiêu đề LSB. Theo như tôi biết thì phương thức rc*.d đang trở nên lỗi thời.
sudodus avatar
lá cờ jp
Trừ khi chúng ta đang nói về các vấn đề bảo mật hoặc quyền riêng tư, tôi nghĩ nó đủ tốt để sử dụng @reboot trong crontab. Bạn chạy nó với quyền root thông qua `sudo crontab -e`. Mặt khác, tôi đề xuất một giải pháp thay thế: thực hiện 'tắt máy tùy chỉnh', **tệp máy tính để bàn** thực thi shellscript, chạy các tác vụ đặc biệt của bạn, sau đó thực hiện tắt máy.
Điểm:1
lá cờ pe

[GIẢI QUYẾT] Đôi khi, bướng bỉnh một chút là cách tốt để tìm ra giải pháp. Tuy nhiên, cảm ơn vì những đóng góp của bạn. Sau một số nghiên cứu dựa trên liên kết của nhận xét trước đây của tôi (câu trả lời của Sebastian Stark), tôi đã kết thúc với tập lệnh này (hãy gọi nó là âmyoffscriptâ) trong thư mục /etc/init.d của mình:

#!/bin/sh
### BẮT ĐẦU THÔNG TIN BAN ĐẦU
# Bắt buộc-Bắt đầu: $local_fs
# Bắt buộc-Dừng: $local_fs
# Cung cấp: Shutdown hoặc Reboot Exec
# Mặc định-Bắt đầu: 4
# Dừng mặc định: 0 6
# Mô tả: Tắt máy hoặc Khởi động lại
### KẾT THÚC THÔNG TIN BAN ĐẦU

trường hợp "$1" trong
    dừng lại)
             echo $(date) >> /ZZZdate # THAY THẾ VÍ DỤ TRƯỚC: THỰC HIỆN CÁC LỆNH TẮT/KHỞI ĐỘNG LẠI TẠI ĐÂY
         ;;
thoát hiểm

thoát 0

Về kịch bản trên, điều quan trọng nhất cần làm nổi bật là:

1 - Tiêu đề LSB (Linux Standard Base) â âDefault-Startâ và âDefault-Stopâ phải có cả hai mức chạy, tương ứng với â0â để tắt máy (rc0.d) và â6â để khởi động lại (rc6.d). Vì tập lệnh của tôi chỉ dành cho tắt máy và khởi động lại và âDefault-Startâ phải được chỉ định, nên tôi đã chọn 4â (rc4.d) phù thủy không được sử dụng/người dùng có thể xác định. Nhưng nó phải chạy ở mức â2â (rc2.d) nếu cần khởi động thứ gì đó khi khởi động (như dịch vụ, daemon,â¦)

2 - Tuyên bố trường hợp - Khi tập lệnh được thực thi bởi hệ thống như một dịch vụ với các đối số âstartâ hoặc âstopâ theo Default-Startâ và Default-Stopâ từ tiêu đề LSB, tất cả các lệnh phải nằm trong thùng máy bản tường trình. (Các lệnh trước câu lệnh tình huống đã bị bỏ qua trong các thử nghiệm của tôi.) Tương ứng với các mức chạy â0â và â6â, câu lệnh trường hợp của tôi chỉ có dừng lại) tùy chọn, nhưng nếu chạy lúc khởi động là cần thiết, một bắt đầu) nên bao gồm tùy chọn (và mức chạy â2â phải được chỉ định trong tiêu đề LSB âDefault-Startâ).

Bây giờ, hãy làm cho nó hoạt động. Trước tiên, làm cho tập lệnh /etc/init.d/myoffscript có thể thực thi được. Sau đó, chúng tôi có hai tùy chọn - với một chỉ huy hoặc thủ công.

Với một lệnh:

# systemctl kích hoạt myoffscript

hoặc

# /lib/systemd/systemd-sysv-install kích hoạt myoffscript

Các liên kết tượng trưng tương đối sẽ được tạo tự động trong các thư mục rc*.d tương ứng (S01myoffscript trong rc4.d và K01myoffscript trong rc0.d và rc6.d theo tập lệnh ở trên) Các lệnh sẽ chỉ hoạt động nếu các liên kết không được tạo trước đó. Nếu không sẽ báo lỗi.

thủ công: Từ mỗi thư mục rc*.d tạo liên kết tượng trưng

# cd /etc/rc4.d
# ln -s ../init.d/myoffscript S01myoffscript
# cd /etc/rc0.d
# ln -s ../init.d/myoffscript K01myoffscript
# cd /etc/rc6.d
# ln -s ../init.d/myoffscript K01myoffscript

Lưu ý: nếu mức chạy â2â được chỉ định trong âDefault-Startâ, liên kết đầu tiên sẽ được tạo trong /etc/rc2.d, v.v... Khởi động lại hệ thống và mọi thứ sẽ hoạt động.

Đây là cách duy nhất mà tôi đã tìm thấy để chạy tập lệnh với quyền root khi tắt máy và khởi động lại với Ubuntu 20.04

Lưu ý: Mặc dù /etc/int.d/etc/rc2.d links vẫn hoạt động để chạy tập lệnh/lệnh khi khởi động, như đã đề cập trong liên kết nhận xét trước đây của tôi, một cách tiếp cận dài hạn sẽ là chuyển đổi tập lệnh init sang đơn vị dịch vụ systemd, do đó, tiêu đề LBS với phương pháp câu lệnh tình huống được mô tả ở trên có thể hữu ích cho các tập lệnh/lệnh khởi động trong một thời gian.

sudodus avatar
lá cờ jp
Cảm ơn đã chia sẻ giải pháp này :-)

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.