Solusi yang disarankan adalah menjalankan unit layanan sebagai layanan normal - lihat [Install]
bagian. Jadi semuanya harus dipikirkan terbalik, ketergantungan juga. Karena urutan shutdown adalah urutan startup terbalik. Itu sebabnya skrip harus ditempatkan di ExecStop=
.
Solusi berikut bekerja untuk saya:
[Unit]
Description=...
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>
[Install]
WantedBy=multi-user.target
RemainAfterExit=true
diperlukan bila Anda tidak memiliki ExecStart
tindakan.
Setelah membuat file, pastikan untuk systemctl daemon-reload
dan systemctl enable yourservice --now
.
Saya baru saja mendapatkannya dari systemd IRC, kredit masuk ke mezcalero.
-
Untuk menjalankan layanan tepat sebelum memulai salah satu dari layanan reboot/shutdown/halt/kexec (yaitu di saat-saat terakhir sebelum sistem file root di-remount menjadi read-only) gunakan konfigurasi layanan ini:
[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
Aktifkan dengan:
systemctl enable my_service.service
-
Untuk menjalankan skrip tepat sebelum aktual reboot/shutdown/halt/kexec (ketika Anda tidak dapat menulis ke sistem file root, karena telah di-remount hanya untuk dibaca) tambahkan skrip ini yang dapat dieksekusi ke
/usr/lib/systemd/system-shutdown
direktori.Segera sebelum menjalankan sistem sebenarnya halt/poweroff/reboot/kexec systemd-shutdown akan menjalankan semua executable di /usr/lib/systemd/system-shutdown/ dan memberikan satu argumen kepada mereka:baik "berhenti", "poweroff", "reboot " atau "kexec", tergantung pada tindakan yang dipilih. Semua executable dalam direktori ini dijalankan secara paralel, dan eksekusi tindakan tidak dilanjutkan sebelum semua executable selesai.
Lihat juga:
https://www.freedesktop.org/software/systemd/man/bootup.html
https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
Sejauh yang saya lihat, ini melakukan apa yang saya butuhkan (tetapi saya tidak tahu persis mengapa).
[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