Jawaban:
Solusi yang disarankan adalah menjalankan unit layanan sebagai layanan normal - lihat [Install]
bagian tersebut. Jadi semuanya harus dipikirkan terbalik, ketergantungan juga. Karena urutan shutdown adalah urutan startup terbalik. Itu sebabnya skrip harus ditempatkan ExecStop=
.
Solusi berikut ini berfungsi untuk saya:
[Unit]
Description=...
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>
[Install]
WantedBy=multi-user.target
RemainAfterExit=true
diperlukan saat 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 akan ke mezcalero.
RemainAfterExit=true
diperlukan ketika tidak ada ExecStart
adalah karena systemd
tidak akan mencoba untuk menjalankan ExecStop
jika berpikir bahwa layanan tidak berjalan. RemainAfterExit=true
menyebabkan systemd
untuk percaya bahwa layanan sedang berjalan, sehingga menyebabkan ia berjalan ExecStop
di shutdown.
Sejauh yang saya bisa melihat ini melakukan apa yang saya butuhkan (tapi 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
kexec.target
bit Sebelum
WantedBy=shutdown.target reboot.target halt.target
ke [Unit]
bagian. Before=
& After=
jangan ubah dependensi.
Untuk menjalankan layanan tepat sebelum memulai layanan reboot / shutdown / halt / kexec (yaitu pada saat-saat terakhir sebelum root filesystem menjadi remount hanya-baca) 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 reboot / shutdown / halt / kexec yang sebenarnya (ketika Anda tidak dapat menulis ke sistem file root, karena itu di-remount hanya-baca) tambahkan skrip ini dapat dieksekusi ke /usr/lib/systemd/system-shutdown
direktori.
Segera sebelum menjalankan sistem yang sebenarnya, halt / poweroff / reboot / kexec systemd-shutdown akan menjalankan semua file executable di / usr / lib / systemd / system-shutdown / dan menyampaikan satu argumen kepada mereka: baik "berhenti", "poweroff", "reboot "atau" kexec ", tergantung pada tindakan yang dipilih. Semua executable di direktori ini dieksekusi secara paralel, dan eksekusi action 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
final.target
. Idealnya saya ingin itu adalah hal pertama yang dieksekusi setelah pengguna melakukannya $ sudo reboot
.
Saya tidak sepenuhnya yakin tetapi saya tidak berpikir Anda perlu menginstal bagian meskipun saya menambahkannya secara eksplisit. Saya juga tidak mengujinya tetapi saya pikir ini akan membantu Anda memulai:
[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
.