Yanıtlar:
Önerilen çözüm, servis birimini normal bir servis olarak çalıştırmaktır - [Install]
bölüme bir göz atın . Bu yüzden her şey ters olarak düşünülmeli, bağımlılıklar da. Çünkü kapatma emri, ters başlangıç emridir. Bu yüzden senaryo yerleştirilmeli ExecStop=
.
Aşağıdaki çözüm benim için çalışıyor:
[Unit]
Description=...
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>
[Install]
WantedBy=multi-user.target
RemainAfterExit=true
Bir ExecStart
işlem yapmadığınızda gereklidir .
Dosyayı oluşturduktan sonra systemctl daemon-reload
ve olduğundan emin olun systemctl enable yourservice --now
.
Daha yeni IRC sisteminden aldım, krediler mezcalero'ya gidiyor.
RemainAfterExit=true
hiçbir varken gereklidir ExecStart
çünkü systemd
çalıştırmayı denemez ExecStop
o hizmeti çalışır durumda olduğunu düşünürse. RemainAfterExit=true
neden systemd
hiç inanmak hizmet böylelikle çalışmasına neden çalıştığını ExecStop
kapatma sırasında.
Bunu görebildiğim kadarıyla ihtiyacım olanı yapıyor (ama tam olarak nedenini bilmiyorum).
[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
Önce biti eklemek isteyebilirsiniz
WantedBy=shutdown.target reboot.target halt.target
için [Unit]
bölüm. Before=
& After=
bağımlılıkları değiştirmeyin.
Herhangi bir yeniden başlatma / kapatma / durma / kexec servisine başlamadan hemen önce bir servis çalıştırmak için (yani, kök dosya sistemi salt okunur hale getirilmeden önceki son anda) bu servis konfigürasyonunu kullanın:
[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
Şunlarla etkinleştir:
systemctl enable my_service.service
Gerçek bir yeniden başlatma / kapatma / durdurma / kexec'ten hemen önce bir komut dosyasını çalıştırmak için (kök dosya sistemine yazamıyorsanız, salt okunur olarak yeniden ayarlandıysa) bu komut dosyasını yürütülebilir /usr/lib/systemd/system-shutdown
dizine ekleyin .
Sistem durdurma / poweroff / reboot / kexec systemd-stop komutunu çalıştırmadan hemen önce / usr / lib / systemd / system-shutdown / dizinindeki tüm çalıştırılabilir dosyaları çalıştırır ve bunlara bir argüman iletir: "dur", "poweroff", "yeniden başlat" Seçilen eyleme bağlı olarak "veya" kexec ". Bu dizindeki tüm çalıştırılabilir dosyalar paralel olarak yürütülür ve tüm çalıştırılabilirler tamamlanmadan eylemin yürütülmesine devam edilmez.
Ayrıca bakınız:
https://www.freedesktop.org/software/systemd/man/bootup.html
https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
final.target
. İdeal olarak, kullanıcının yaptıktan sonra ilk gerçekleştirilen şey olmasını isterim $ sudo reboot
.
Tamamen emin değilim ama açıkça eklemiş olmama rağmen kurulum kısmına ihtiyacınız olmadığını düşünüyorum. Ayrıca test etmedim ama başlamanıza yardımcı olacağını düşünüyorum:
[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
.