Kapatma işleminden hemen önce systemd içeren bir komut dosyası nasıl çalıştırılır?


58

[install]Bölüme koymak için neye ihtiyacım var , böylece sistemd /home/me/so.plkapanmadan hemen önce ve ayrıca bozulmadan önce çalışır /proc/self/net/dev?

[Unit]
Description=Log Traffic

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

[Install]
?

Yanıtlar:


66

Ö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=trueBir ExecStartişlem yapmadığınızda gereklidir .

Dosyayı oluşturduktan sonra systemctl daemon-reloadve olduğundan emin olun systemctl enable yourservice --now.

Daha yeni IRC sisteminden aldım, krediler mezcalero'ya gidiyor.


6
Ubuntu 16.04'te bir sahip olmalısınız ExecStart=/bin/true.
Niels,

3
Benim varsayım NEDEN RemainAfterExit=true hiçbir varken gereklidir ExecStartçünkü systemdçalıştırmayı denemez ExecStopo hizmeti çalışır durumda olduğunu düşünürse. RemainAfterExit=trueneden systemdhiç inanmak hizmet böylelikle çalışmasına neden çalıştığını ExecStopkapatma sırasında.
Felipe Alvarez

1
Kullanıcı oturumları ve kullanıcı işlemleri sonlandırılmadan önce bu betiğin çalışmasını ve tamamlanmasını sağlamak için yine de var mı?
richmb

@richmb Hiç de değil. Gönderen docs :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

Bunu ve çeşitli yinelemeleri denedim ama Debian Stretch'te çalışmıyor.
02.02.20

8

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

3
2 şeyden dolayı işe yarıyor: 1) DefaultDependencies = no, tüm bağımlılıkları görmezden gelmesini sağlar ve "ilk önce" başlangıçta ve "sonda" dururken, her zaman "Önce" ve "Sonra" cümlelerine saygı gösterir. 2) Kapanma / yeniden başlatma / durdurma hedeflerinde bir Durdurma yan tümcesi olduğu için olur, bu nedenle durdurma / yeniden başlatma / durdurma durdurma noktasına gelmeden hemen önce çalışır (çünkü yalnızca durdurulduğunda çalışırlar, istediğinizi yaparlar).
RDP

kexec.targetÖnce biti eklemek isteyebilirsiniz
hanetzer

Bu benim için işe yaramıyor
Bug Killer

Ben de eklemek sürece bu işe nasıl görmüyorum WantedBy=shutdown.target reboot.target halt.targetiçin [Unit]bölüm. Before=& After=bağımlılıkları değiştirmeyin.
saat

1
@FelipeAlvarez: Yorumumu kaldırdım.
sid_com

7
  • 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-shutdowndizine 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


1
Bir yeniden başlatma başlattıktan sonra mümkün olduğu kadar yakın bir şey yapmak istiyorum final.target. İdeal olarak, kullanıcının yaptıktan sonra ilk gerçekleştirilen şey olmasını isterim $ sudo reboot.
Jaime Hablutzel

5

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

Bunu denediğimde komut dosyası başlattıktan hemen sonra yürütülür (önyükleme).
sid_com

@sid_com okuduktan sonra thread.gmane.org/gmane.comp.sysutils.systemd.devel/4515/... DefaultDependencies eklemeyi deneyin = hayır ve belki yüklemek bölümü kaldırmak. Aksi taktirde, sonraki / gerekli satırları uzaktan kumanda etmeye yardımcı olabilir.
Ulrich Dangel
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.