Bir betiği systemd ile kapatıldığında her şeyden önce nasıl çalıştırırım?


17

Not: Kısaca formüle edilmiş soru altta bulunabilir.

Dosyalarımı harici bir USB sürücüsüne yedekleyen bir komut dosyası var. Oluşturduğum yeni veri miktarına bağlı olarak, bu işlemin uygulanması biraz zaman alabilir. Sistemin her kapanışında otomatik olarak çalıştırmak istiyorum.

En son güncellemelerle (systemd) fedora 23 kullanıyorum.

Bunu birkaç şekilde başarmaya çalıştım, ama işe yaramadım.

StopExec ile uzun süren işlem

autobackup.service:

[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

İle etkinleştirdim systemctl enable autobackup.serviceve ile başladım systemctl start autobackup.service.

Önyükleme günlüğümün bir parçası ( 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.

Ben arasında bir şey kısaltmak olmadığını unutmayın, komut dosyası başlamadan hemen önce gerçekten monte / mnt / BACKUP, komik tesadüf ..

Kapanmadan önce. Hedef

autobackup.service:

[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

Çıktı temelde aynıdır.

Sorun

Bence sistemd, her iki durumda da BACKUP bağlantısını kesen ve boru altyapısını devre dışı bırakan diğer kapatma komut dosyalarına paralel olarak benim betiğimi başlatır.

Soru

Systemd'ye komut dosyasını ilk olarak kapatma sırasında başlatmayı, çıkana kadar beklemeyi ve ardından geri kalan kapatma komut dosyalarını / hedefleri / birimleri / herhangi bir şekilde başlatmayı nasıl öğretebilirim?

Yanıtlar:


12

Servis dosyaları oluşturmaya veya düzenlemeye gerek yok. Senaryonuzu buraya bırakın

/usr/lib/systemd/system-shutdown/

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

Gerçek sistemi durdurmadan hemen önce / poweroff / reboot / kexec systemd-shutdown / usr / lib / systemd / system-shutdown / içindeki tüm yürütülebilir dosyaları çalıştırır ve bunlara bir argüman iletir: ya "halt", "poweroff", "reboot "veya" kexec "i seçin. Bu dizindeki tüm yürütülebilir dosyalar paralel olarak yürütülür ve tüm yürütülebilir dosyalar bitmeden eylemin yürütülmesine devam edilmez.

PC hoparlörünün bip sesini duymak için kullanıyorum.


2
Bu dizini yapmak zorunda mıydınız? Ne Ubuntu 16.04 ne de Raspbian (jessie) üzerinde yok - her ikisi de systemd tabanlı.
WoJ

2
Debian sistemleri farklı yolu kullanır /lib/systemd/system-shutdown/. Ayrıca, bu komut dosyalarının, dosya sistemleri zaten salt okunur olarak monte edildikten sonra, kapanma sırasında çok geç yürütüldüğünü unutmayın. Bu nedenle, read-write ( mount -oremount,rw /) olarak yeniden numaralandırılmadığı sürece dosya sistemine herhangi bir yazma erişimi başarısız olur . Bkz. Komut dosyalarını yeniden başlatma veya kapatma sırasında / usr / lib / systemd / system-shutdown / içinde nasıl yürütülür?
Frank Breitling

9
OP betiğin kapatılmasında "her şeyden önce" çalıştırılmasını istedi. Sistem kapatma komut dosyaları, çekirdeği öldürmeden hemen önce, her şeyden sonra yürütülür.
Greg Alexander

11

Anladım!

Çözüm alın StopExec ile uzun süre çalışan işlem ve bu şekilde değiştirin:

autobackup.service:

[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

Çizgiye dikkat edin:

RequiresMountsFor=/mnt/BACKUP /home

Bu şekilde beklendiği gibi çalışır.


2
Yapmanıza gerek yok systemctl edit. systemctl enable autobackupaynı etkiye sahiptir ve daha deyimseldir ve [Install]ünitenizdeki bölüme zaten sahip olduğunuzdan çalışmalıdır . Yine de, hedef adındaki bu yazım hatasını düzeltmeniz gerekecektir. ;)
Stefan Majewsky

OMG Herhangi bir sürücünün bağlantısı kesilmeden ÖNCE yedekleme betiğimi çağıracak bir çözüm arıyordum. Teşekkür ederim!
deanresin

2
Bu benim için işe yaramıyor. Herhangi bir bağ var, sadece diğer birimler kapatılmadan önce benim komut dosyası çalıştığından emin olmak istiyorum.
2rs2ts
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.