Bagaimana menjalankan skrip dengan systemd sebelum shutdown?

58

Apa yang perlu saya letakkan di [install]bagian ini, sehingga systemd berjalan /home/me/so.pltepat sebelum shutdown dan juga sebelum /proc/self/net/devdihancurkan?

[Unit]
Description=Log Traffic

[Service]
ExecStart=/home/me/so.pl

[Install]
?
sid_com
sumber

Jawaban:

66

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=truediperlukan saat Anda tidak memiliki ExecStarttindakan.

Setelah membuat file, pastikan untuk systemctl daemon-reloaddan systemctl enable yourservice --now.

Saya baru saja mendapatkannya dari systemd IRC, kredit akan ke mezcalero.

Matthias
sumber
6
Di ubuntu 16.04 Anda harus memiliki ExecStart=/bin/true.
Niels
3
Asumsi saya untuk MENGAPA RemainAfterExit=true diperlukan ketika tidak ada ExecStartadalah karena systemdtidak akan mencoba untuk menjalankan ExecStopjika berpikir bahwa layanan tidak berjalan. RemainAfterExit=truemenyebabkan systemduntuk percaya bahwa layanan sedang berjalan, sehingga menyebabkan ia berjalan ExecStopdi shutdown.
Felipe Alvarez
1
Apakah ada pula untuk memastikan skrip ini akan berjalan dan selesai sebelum sesi pengguna dan proses pengguna dihentikan?
richmb
@ Richmb Tidak sama sekali. Dari dokumen :Note that it is usually not sufficient to specify a command for this setting that only asks the service to terminate (for example, by queuing some form of termination signal for it), but does not wait for it to do so.
svenwltr
Saya sudah mencoba ini dan berbagai iterasi di atasnya tetapi tidak berhasil pada Debian Stretch.
2rs2ts
8

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
sid_com
sumber
3
Ini terjadi karena 2 hal: 1) DefaultDependencies = tidak membuatnya mengabaikan semua dependensi dan menjalankan "pada awalnya" saat start dan "akhirnya" saat berhenti, selalu menghormati klausa "Sebelum" dan "Setelah". 2) Kebetulan memiliki klausa Sebelum pada target shutdown / reboot / stop, sehingga akan berjalan sesaat sebelum shutdown / reboot / halt tercapai pada stop (karena mereka hanya berjalan pada stop itu terjadi untuk melakukan apa yang Anda inginkan).
RDP
Anda mungkin ingin menambahkan kexec.targetbit Sebelum
hanetzer
Ini tidak berhasil untuk saya
Bug Killer
Saya tidak melihat bagaimana ini akan berhasil kecuali Anda juga menambahkan WantedBy=shutdown.target reboot.target halt.targetke [Unit]bagian. Before=& After=jangan ubah dependensi.
rsaw
1
@FelipeAlvarez: Saya telah menghapus komentar saya.
sid_com
7
  • 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-shutdowndirektori.

    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

Piotr Jurkiewicz
sumber
1
Saya ingin menjalankan sesuatu sedekat mungkin setelah memulai reboot, jauh sebelum final.target. Idealnya saya ingin itu adalah hal pertama yang dieksekusi setelah pengguna melakukannya $ sudo reboot.
Jaime Hablutzel
5

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
Ulrich Dangel
sumber
Ketika saya mencoba ini, skrip akan dieksekusi segera setelah start (boot).
sid_com
@sid_com Setelah membaca thread.gmane.org/gmane.comp.sysutils.systemd.devel/4515/... coba tambahkan DefaultDependencies = tidak dan mungkin hapus bagian instal. Kalau tidak, mungkin akan membantu untuk me-remote baris after / membutuhkan.
Ulrich Dangel