शटडाउन से ठीक पहले सिस्टमड के साथ स्क्रिप्ट कैसे चलाएं?


58

मुझे [install]अनुभाग में क्या डालने की आवश्यकता है , ताकि सिस्टमड /home/me/so.plबंद होने से ठीक पहले और /proc/self/net/devनष्ट होने से पहले भी चले ?

[Unit]
Description=Log Traffic

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

[Install]
?

जवाबों:


66

सुझाए गए समाधान सेवा इकाई को एक सामान्य सेवा के रूप में चलाना है - [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 जा रहा है।


6
Ubuntu 16.04 में आपके पास होना चाहिए ExecStart=/bin/true
नील्स

3
WHY के लिए मेरी धारणा RemainAfterExit=trueतब आवश्यक है जब कोई नहीं ExecStartहै क्योंकि systemdचलाने की कोशिश नहीं की जाएगी ExecStopयदि यह सोचता है कि सेवा नहीं चल रही है। यह विश्वास करने का RemainAfterExit=trueकारण है कि सेवा चल रही है, जिससे यह शटडाउन पर चल रही है। systemdExecStop
फेलिप अल्वारेज़

1
वैसे भी यह सुनिश्चित करने के लिए है कि यह स्क्रिप्ट उपयोगकर्ता सत्रों और उपयोगकर्ता प्रक्रियाओं के समाप्त होने से पहले ही चलेगी और पूरी होगी?
रिचटम

@richmb बिल्कुल नहीं। से डॉक्स :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

मैंने इस पर और विभिन्न पुनरावृत्तियों पर कोशिश की है लेकिन यह डेबियन स्ट्रेच पर काम नहीं करता है।
2rs2ts

8

जहाँ तक मैं यह देख सकता हूँ कि मुझे क्या चाहिए (लेकिन मुझे ठीक से पता नहीं क्यों)।

[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 चीजों के कारण काम करता है: 1) डिफाल्ड डिपेंडेंसीज = कोई नहीं बनाता है यह सभी निर्भरताओं को नजरअंदाज करता है और "शुरू में" और "स्टॉप पर" आखिरी पर, हमेशा "पहले" और "बाद में" का सम्मान करता है। 2) ऐसा होता है कि शटडाउन / रिबूट / हॉल्ट टारगेट पर एक पूर्व क्लॉज होता है, इसलिए यह शटडाउन / रिबूट / हॉल्ट पर रुकने से पहले ही चलेगा (क्योंकि वे केवल स्टॉप पर ही चलते हैं, यह वही होता है जो आप चाहते हैं)।
RDP

आप kexec.target
बजे

यह मेरे लिए काम नहीं करता है
बग किलर

मैं यह कैसे काम करेगा जब तक कि आप भी जोड़ नहीं दिख रहा है WantedBy=shutdown.target reboot.target halt.targetकरने के लिए [Unit]खंड। Before=और After=निर्भरता नहीं बदलते।
rsaw 15

1
@FelipeAlvarez: मैंने अपनी टिप्पणी हटा दी है।
sid_com

7
  • किसी भी रिबूट / शटडाउन / हाल्ट / 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


1
मैं रिबूट शुरू करने के बाद पास के रूप में संभव के रूप में कुछ निष्पादित करना चाहते हैं, जिस तरह से पहले final.target। आदर्श रूप में मैं चाहूंगा कि उपयोगकर्ता द्वारा किए जाने के बाद यह पहली चीज है $ sudo reboot
बजे जैम हैबटलजेल

5

मैं पूरी तरह से निश्चित नहीं हूं, लेकिन मुझे नहीं लगता कि आपको इंस्टॉल भाग की आवश्यकता है, हालांकि मैंने इसे स्पष्ट रूप से जोड़ा है। मैंने इसका परीक्षण भी नहीं किया लेकिन मुझे लगता है कि इसे शुरू करने में आपकी मदद करनी चाहिए:

[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

जब मैं यह कोशिश करता हूं तो स्क्रिप्ट शुरुआत (बूट) के तुरंत बाद निष्पादित हो जाती है।
sid_com

@sid_com धागे को पढ़ने के बाद। gmane.org/gmane.comp.sysutils.systemd.devel/4515/… DefaultD dependencies = no जोड़ने की कोशिश करें और हो सकता है कि संस्थापन अनुभाग निकालें। अन्यथा इसके बाद / दूरियों की आवश्यकता होती है।
उलरिच डांगेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.