GNU/Linux >> Belajar Linux >  >> Linux

Systemd :Cara mengeksekusi skrip hanya saat shutdown (bukan saat reboot)

Saya akhirnya menemukan cara melakukannya.

Ini pemikiran yang agak retas, tetapi berhasil.

Saya telah menggunakan beberapa bagian dari utas ini:https://stackoverflow.com/questions/25166085/how-can-a-systemd-controlled-service-distinguish-between-shutdown-and-reboot

dan utas ini:Bagaimana cara menjalankan skrip dengan systemd tepat sebelum dimatikan?

Saya telah membuat layanan ini /etc/systemd/system/shutdown_screen.service

[Unit]
Description=runs only upon shutdown
Conflicts=reboot.target
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/bin/bash /usr/local/bin/shutdown_screen
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Yang akan dieksekusi di shudown/reboot/halt/whatever.(jangan lupa untuk mengaktifkannya)

Dan di skrip saya /usr/local/bin/shutdown_screen Saya menempatkan yang berikut :

#!/bin/bash
# send a shutdown message only at shutdown (not at reboot)    
/usr/bin/systemctl list-jobs | egrep -q 'reboot.target.*start' || echo "shutdown" | nc 192.168.0.180 4243 -w 1

Yang akan mengirimkan pesan matikan ke arduino saya, yang akan mematikan layar saya.


Menurut systemd.special manual, Anda harus menggunakan Before=poweroff.target .

poweroff.target

A special target unit for shutting down and powering off the system.

Applications wanting to power off the system should start this unit.

runlevel0.target is an alias for this target unit, for compatibility with SysV.

Selain itu, seperti yang saya sebutkan di komentar saya, Anda harus memasukkan skrip khusus ke dalam /etc/systemd/system/ . /usr/lib/systemd/system/ direktori dimaksudkan untuk digunakan untuk skrip yang disediakan sistem.

Jadi, mungkin seperti ini:

[Unit]
Description=runs only upon shutdown
DefaultDependencies=no
Conflicts=reboot.target
Before=shutdown.target
Requires=poweroff.target

[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/usr/local/bin/yourscript
RemainAfterExit=yes

Dari membaca jawaban di sini sepertinya ada banyak kesalahpahaman tentang cara kerja systemd. Pertama, jangan gunakan konflik untuk mengecualikan target. Hal ini dimaksudkan agar layanan yang bertentangan tidak dijalankan pada waktu yang sama.

Jika suatu unit memiliki pengaturan Konflik=di unit lain, memulai yang pertama akan menghentikan yang terakhir dan sebaliknya.

Unit berarti file .service untuk meluncurkan layanan tertentu, bukan target yang harus dijangkau. Dengan kata lain Conflicts=reboot.target paling tidak ada artinya dan paling buruk itu akan mencegah Anda melakukan boot ulang. Jangan lakukan ini. Itu tidak berarti jangan jalankan ini saat reboot. Itu berarti batalkan layanan ini atau reboot.target tergantung pada waktu dan bagaimana systemd menginterpretasikan penggunaan konflik yang salah ini.

Berikut adalah contoh unit penyiapan saat ini (alias file .service) yang hanya berjalan saat shutdown, bukan reboot:

[Unit]
Description=Play sound
DefaultDependencies=no
Before=poweroff.target halt.target

[Service]
ExecStart=/usr/local/bin/playsound.sh
ExecStop=/usr/local/bin/playsound.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=poweroff.target halt.target 

poweroff.target setara dengan systemv run level0 lama yang hanya tercapai saat shutdown. halt.target adalah jalur shutdown alternatif yang digunakan oleh systemd juga tidak dapat dijangkau dengan reboot. Bagian instal memberi tahu systemd untuk menambahkan layanan ini ke daftar yang harus diselesaikan sebelum poweroff.target atau halt.target akan dianggap tercapai.

Layanan ini diinstal dan dijalankan di sistem saya.


Linux
  1. Cara Mengeksekusi Perintah/Script Secara Otomatis Selama Reboot atau Startup

  2. Cara Menonaktifkan Perintah Shutdown dan Reboot di Linux

  3. Cara Shutdown atau Reboot Linux menggunakan Command Line

  1. Linux – Bagaimana Cara Menjalankan Script Dengan Systemd Tepat Sebelum Shutdown?

  2. Cara membersihkan hanya target di buildroot

  3. Bagaimana cara menjalankan skrip sebelum yang lainnya dimatikan dengan systemd?

  1. Linux – Reboot Hanya Userspace?

  2. Cara mematikan atau me-reboot Linux

  3. Bagaimana cara menjalankan skrip Python dari Java?