जवाबों:
सुझाए गए समाधान सेवा इकाई को एक सामान्य सेवा के रूप में चलाना है - [Install]
अनुभाग पर एक नज़र डालें । तो सब कुछ उल्टा सोचना पड़ता है, निर्भरता भी। क्योंकि शटडाउन ऑर्डर रिवर्स स्टार्टअप ऑर्डर है। इसलिए स्क्रिप्ट को अंदर रखना पड़ता है ExecStop=
।
निम्नलिखित समाधान मेरे लिए काम कर रहा है:
[Unit]
Description=...
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>
[Install]
WantedBy=multi-user.target
RemainAfterExit=true
जब आपके पास कोई ExecStart
कार्रवाई न हो, तो इसकी आवश्यकता है।
फ़ाइल बनाने के बाद, सुनिश्चित करें systemctl daemon-reload
और systemctl enable yourservice --now
।
मैं इसे सिर्फ़ IRC से प्राप्त करता हूँ, क्रेडिट mezcalero जा रहा है।
RemainAfterExit=true
तब आवश्यक है जब कोई नहीं ExecStart
है क्योंकि systemd
चलाने की कोशिश नहीं की जाएगी ExecStop
यदि यह सोचता है कि सेवा नहीं चल रही है। यह विश्वास करने का RemainAfterExit=true
कारण है कि सेवा चल रही है, जिससे यह शटडाउन पर चल रही है। systemd
ExecStop
जहाँ तक मैं यह देख सकता हूँ कि मुझे क्या चाहिए (लेकिन मुझे ठीक से पता नहीं क्यों)।
[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
WantedBy=shutdown.target reboot.target halt.target
करने के लिए [Unit]
खंड। Before=
और After=
निर्भरता नहीं बदलते।
किसी भी रिबूट / शटडाउन / हाल्ट / kexec सेवाओं को शुरू करने से पहले एक सेवा चलाने के लिए (यानी रूट फाइल सिस्टम पढ़ने से पहले अंतिम समय में ही समाप्त हो जाता है) इस सेवा विन्यास का उपयोग करें:
[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
इसे सक्षम करें:
systemctl enable my_service.service
वास्तविक रिबूट / शटडाउन / पड़ाव / kexec से पहले एक स्क्रिप्ट चलाने के लिए (जब आप रूट फाइल सिस्टम को नहीं लिख सकते, क्योंकि यह केवल पढ़ने के लिए लिखा गया था) इस स्क्रिप्ट को /usr/lib/systemd/system-shutdown
निर्देशिका में निष्पादन योग्य जोड़ें ।
वास्तविक सिस्टम हाल्ट / पॉवरऑफ़ / रिबूट / क्लेस्ट सिस्टेम-शटडाउन को निष्पादित करने से तुरंत पहले सभी निष्पादक / usr / lib / systemd / system-shutdown / चलाएंगे और उनमें से एक तर्क पास करेंगे: या तो "हॉल्ट", "पॉवरऑफ़", "रिबूट" "या" kexec ", चुने हुए कार्रवाई पर निर्भर करता है। इस निर्देशिका में सभी निष्पादनों को समानांतर में निष्पादित किया जाता है, और सभी निष्पादनयोग्य समाप्त होने से पहले कार्रवाई का निष्पादन जारी नहीं होता है।
और देखें:
https://www.freedesktop.org/software/systemd/man/bootup.html
https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
final.target
। आदर्श रूप में मैं चाहूंगा कि उपयोगकर्ता द्वारा किए जाने के बाद यह पहली चीज है $ sudo reboot
।
मैं पूरी तरह से निश्चित नहीं हूं, लेकिन मुझे नहीं लगता कि आपको इंस्टॉल भाग की आवश्यकता है, हालांकि मैंने इसे स्पष्ट रूप से जोड़ा है। मैंने इसका परीक्षण भी नहीं किया लेकिन मुझे लगता है कि इसे शुरू करने में आपकी मदद करनी चाहिए:
[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
।