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.