Bagaimana saya menjalankan skrip sebelum semua yang lain pada shutdown dengan systemd?

17

Catatan: Pertanyaan yang dirumuskan secara singkat dapat ditemukan di bagian bawah.

Saya memiliki skrip yang membuat cadangan file saya ke drive USB eksternal. Menjalankannya bisa memakan waktu cukup lama, tergantung pada jumlah data baru yang saya buat. Saya ingin menjalankannya secara otomatis pada setiap shutdown sistem.

Saya menggunakan fedora 23 dengan pembaruan terbaru (systemd).

Saya mencoba mencapai ini dalam beberapa cara, tetapi saya tidak bisa membuatnya bekerja.

Proses berjalan lama dengan StopExec

layanan autobackup:

[Unit]
Description=Slow backup script
Requires=local-fs.target

[Service]
ExecStart=/bin/true
ExecStop=/etc/systemd/system/do_backup.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multiuser.target

Saya mengaktifkannya systemctl enable autobackup.servicedan memulainya dengan systemctl start autobackup.service.

Bagian dari log boot saya ( journalctl -b-1):

Dez 22 17:45:27 localhost systemd[1]: Unmounted /mnt/BACKUP.
Dez 22 17:45:27 localhost do_backup.sh[4296]: At subvol /home/BACKUP.2015_12_22-17_45_25
Dez 22 17:45:27 localhost do_backup.sh[4296]: ERROR: parent subvol is not reachable from inside the root subvol.
Dez 22 17:45:27 localhost do_backup.sh[4296]: At snapshot BACKUP.2015_12_22-17_45_25
Dez 22 17:45:27 localhost do_backup.sh[4296]: ERROR: failed to dump stream. Broken pipe
Dez 22 17:45:27 localhost systemd[1]: autobackup.service: Control process exited, code=exited status=1
Dez 22 17:45:27 localhost systemd[1]: Stopped Slow backup script.
Dez 22 17:45:27 localhost systemd[1]: autobackup.service: Unit entered failed state.

Perhatikan bahwa saya tidak mempersingkat apa pun di antaranya, itu benar-benar tidak terpasang / mnt / CADANGAN tepat sebelum skrip dimulai, kebetulan lucu ..

Sebelum shutdown.target

layanan autobackup:

[Unit]
Description=Slow backup script
DefaultDependencies=no
Before=shutdown.target

[Service]
ExecStart=/etc/systemd/system/do_backup.sh
Type=oneshot

systemctl edit shutdown.target

[Unit]
Requires=autobackup.service

Output pada dasarnya sama.

Masalah

Saya pikir masalahnya adalah bahwa systemd memulai skrip saya secara paralel dengan semua skrip shutdown lainnya dalam kedua kasus, yang meng-unmount CADANGAN dan menonaktifkan infrastruktur pipa (kesalahan lain yang kadang-kadang saya dapatkan, ketika unmount tidak cukup cepat).

Pertanyaan

Bagaimana saya bisa mengajarkan systemd untuk memulai skrip saya pertama pada shutdown, tunggu sampai keluar dan kemudian mulai sisa skrip shutdown / target / unit / apa pun?

le_me
sumber

Jawaban:

12

Tidak perlu membuat atau mengedit file layanan. Cukup masukkan skrip Anda

/usr/lib/systemd/system-shutdown/

https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html

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.

Saya menggunakannya untuk sekadar membunyikan speaker PC.

Joost
sumber
2
Apakah Anda harus membuat direktori ini? Saya tidak memilikinya baik di Ubuntu 16.04 atau Raspbian (jessie) - keduanya berbasis sistem.
WoJ
2
Sistem Debian menggunakan jalur yang berbeda /lib/systemd/system-shutdown/. Dan di samping itu, perlu diketahui bahwa skrip ini dieksekusi sangat terlambat dalam shutdown, setelah sistem file sudah di-mount read-only. Jadi setiap akses tulis ke sistem file akan gagal kecuali remounted sebagai baca-tulis ( mount -oremount,rw /). Lihat Bagaimana menjalankan skrip di / usr / lib / systemd / system-shutdown / saat reboot atau shutdown?
Frank Breitling
9
OP meminta skrip dieksekusi "sebelum yang lainnya" saat shutdown. Skrip shutdown sistem dijalankan setelah semua yang lain, segera sebelum mematikan kernel.
Greg Alexander
11

Saya mendapatkannya!

Ambil solusi Proses berjalan lama dengan StopExec dan memodifikasinya seperti ini:

layanan autobackup:

[Unit]
Description=Slow backup script
RequiresMountsFor=/mnt/BACKUP /home

[Service]
ExecStop=/etc/systemd/system/do_backup.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Perhatikan baris:

RequiresMountsFor=/mnt/BACKUP /home

Ini berfungsi seperti yang diharapkan dengan cara ini.

le_me
sumber
2
Anda tidak perlu melakukan itu systemctl edit. systemctl enable autobackupmemiliki efek yang sama dan lebih idiomatis, dan harus berfungsi karena Anda sudah memiliki [Install]bagian di unit Anda. Anda harus memperbaiki kesalahan ketik itu di nama target. ;)
Stefan Majewsky
OMG Saya sudah mencari begitu lama untuk solusi memanggil skrip cadangan saya SEBELUM drive tidak di-mount. Terima kasih!
deanresin
2
Ini tidak bekerja untuk saya. Saya tidak memiliki mount, saya hanya ingin memastikan skrip saya berjalan sebelum unit lain dimatikan.
2rs2ts