Câu trả lời:
Giải pháp được đề xuất là chạy đơn vị dịch vụ như một dịch vụ bình thường - hãy xem [Install]
phần này. Vì vậy, mọi thứ phải được suy nghĩ ngược lại, phụ thuộc quá. Bởi vì thứ tự tắt máy là thứ tự khởi động ngược. Đó là lý do tại sao kịch bản phải được đặt vào ExecStop=
.
Giải pháp sau đây có hiệu quả với tôi:
[Unit]
Description=...
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>
[Install]
WantedBy=multi-user.target
RemainAfterExit=true
là cần thiết khi bạn không có một ExecStart
hành động.
Sau khi tạo tập tin, hãy chắc chắn systemctl daemon-reload
và systemctl enable yourservice --now
.
Tôi vừa nhận được nó từ IRC hệ thống, các khoản tín dụng sẽ đến mezcalero.
RemainAfterExit=true
là bắt buộc khi không có ExecStart
là vì systemd
sẽ không cố chạy ExecStop
nếu nó nghĩ rằng dịch vụ không chạy. RemainAfterExit=true
nguyên nhân systemd
để tin rằng dịch vụ đang chạy, do đó khiến nó chạy ExecStop
khi tắt máy.
Theo như tôi có thể thấy điều này làm những gì tôi cần (nhưng tôi không biết chính xác tại sao).
[Unit]
Description=Log Traffic
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
[Service]
ExecStart=/usr/local/bin/perl /home/me/log_traffic.pl --stop
Type=oneshot
kexec.target
vào bit Before
WantedBy=shutdown.target reboot.target halt.target
vào [Unit]
phần. Before=
& After=
không thay đổi phụ thuộc.
Để chạy một dịch vụ ngay trước khi bắt đầu bất kỳ dịch vụ khởi động lại / shutdown / halt / kexec nào (tức là trong giây phút cuối cùng trước khi hệ thống tập tin gốc trở thành chỉ đọc lại), hãy sử dụng cấu hình dịch vụ này:
[Unit]
Description=Save system clock on shutdown
DefaultDependencies=no
After=final.target
[Service]
Type=oneshot
ExecStart=/usr/lib/systemd/scripts/fake-hwclock.sh save
[Install]
WantedBy=final.target
Kích hoạt nó với:
systemctl enable my_service.service
Để chạy tập lệnh ngay trước khi khởi động lại / shutdown / halt / kexec thực tế (khi bạn không thể ghi vào hệ thống tập tin gốc, vì nó được đọc lại chỉ đọc) hãy thêm tập lệnh này vào /usr/lib/systemd/system-shutdown
thư mục.
Ngay lập tức trước khi thực hiện hệ thống thực tế tạm dừng / poweroff / restart / kexec systemd-shutdown sẽ chạy tất cả các thực thi trong / usr / lib / systemd / system-shutdown / và truyền một đối số cho chúng: hoặc "tạm dừng", "poweroff", "khởi động lại "Hoặc" kexec ", tùy thuộc vào hành động đã chọn. Tất cả các tệp thực thi trong thư mục này được thực thi song song và việc thực thi hành động không được tiếp tục trước khi tất cả các tệp thực thi kết thúc.
Cũng thấy:
https://www.freedesktop.org/software/systemd/man/bootup.html
https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
final.target
. Lý tưởng nhất tôi muốn rằng đó là điều đầu tiên được thực hiện sau khi người dùng làm $ sudo reboot
.
Tôi không hoàn toàn chắc chắn nhưng tôi không nghĩ bạn cần phần cài đặt mặc dù tôi đã thêm nó một cách rõ ràng. Tôi cũng không kiểm tra nhưng tôi nghĩ nó sẽ giúp bạn bắt đầu:
[Unit]
Description=Log Traffic
Requires=network.target
After=network.target
Before=shutdown.target
DefaultDependencies=no
[Service]
ExecStart=/home/me/so.pl
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=shutdown.target
ExecStart=/bin/true
.