स्टार्ट अप पर स्क्रिप्ट कैसे चलाएं?

मैं स्क्रिप्ट कैसे चला सकता हूं स्वचालित रूप से जब उबंटू शुरू होता है तो मुझे स्टार्टअप के बाद उन्हें मैन्युअल रूप से नहीं चलाना पड़ता है?

एक दृष्टिकोण @रिबूट जोड़ना है क्रॉन कार्य:

  1. चल रहा है crontab -e आपको अपना क्रॉन संपादित करने की अनुमति देगा ।
  2. इस तरह एक लाइन जोड़ना:

    @reboot /path/to/script

    एक बार आपका कंप्यूटर बूट होने के बाद उस स्क्रिप्ट को निष्पादित करेगा ।

आपको किस प्रकार की स्क्रिप्ट चलाने की आवश्यकता है, इसके आधार पर । . सेवाओं के लिए और जैसे आपको उपयोग करना चाहिए अपस्टार्ट. लेकिन एक उपयोगकर्ता स्क्रिप्ट के लिए इन्हें गनोम द्वारा सत्र स्क्रिप्ट के रूप में लॉन्च किया जाना चाहिए! एक नज़र है के तहत प्रणाली > वरीयताओं > स्टार्टअप अनुप्रयोगों ।

एक तरफ ध्यान दें यदि आपको टर्मिनल लॉगिन पर चलाने के लिए कुछ स्क्रिप्ट की आवश्यकता है तो आप उन्हें जोड़ सकते हैं .बैश_लॉगिन अपने होम डायरेक्टरी में फाइल करें ।

14.04 और पुराने के लिए

एक साधारण कमांड (जिसे चलने की आवश्यकता नहीं है) एक अपस्टार्ट नौकरी का उपयोग कर सकता है जैसे:

start on startuptaskexec /path/to/command

इसे एक में सहेजें .conf फ़ाइल में /etc/init (यदि आपको सिस्टम बूट होने पर रूट के रूप में चलाने की आवश्यकता है), या में ~/.config/upstart (यदि आपको इसकी आवश्यकता हैजब आप लॉग इन करते हैं तो अपने उपयोगकर्ता के रूप में चलाने के लिए) ।

आप इसमें कमांड जोड़ सकते हैं /etc/rc.local:

sudo nano /etc/rc.local

यह कमांड को रूट के रूप में निष्पादित करता है ।

एक विशिष्ट उपयोगकर्ता के रूप में कमांड निष्पादित करने के लिए, उपयोग करें sudo -i -u (-i लॉगिन शेल भी चलाने के लिए) । उदाहरण के लिए, एक सतत एसएसएच सुरंग स्थापित करना, जहां myhost है definde में johndoes ~/.ssh/config फ़ाइल:

sudo -i -u johndoe autossh -nNT -L 1234:localhost:1234 myhost

ध्यान दें कि यदि /etc/rc.local मौजूद नहीं था (जैसा कि 16.04 से उबंटू पर मामला है), आपको एक जोड़ना होगा शेबंग लाइन शीर्ष पर (जैसे #!/bin/bash), और सुनिश्चित करें कि फ़ाइल निष्पादन योग्य है:

sudo chmod a+x /etc/rc.local

15.04 और बाद के लिए:

एक (अल्पकालिक)चलाने के लिए1 स्टार्टअप पर कमांड का उपयोग कर systemd, आप प्रकार की एक सिस्टमड इकाई का उपयोग कर सकते हैं OneShot. उदाहरण के लिए, बनाएं /etc/systemd/system/foo.service युक्त:

[Unit]Description=Job that runs your user script[Service]ExecStart=/some/commandType=oneshotRemainAfterExit=yes[Install]WantedBy=multi-user.target

फिर भागो:

sudo systemctl daemon-reloadsudo systemctl enable foo.service

अनिवार्य रूप से, यह सिर्फ परिवर्तित हो रहा है एक विशिष्ट अपस्टार्ट नौकरी करने के लिए एक systemd एक (देखें अपस्टार्ट उपयोगकर्ताओं के लिए सिस्टमड).

आप एकाधिक का उपयोग करके एक ही सेवा फ़ाइल से कई कमांड चला सकते हैं ExecStart लाइनें:

[Service]ExecStart=/some/commandExecStart=/another/command some argsExecStart=-/a/third/command ignore failure

आदेश हमेशा पूर्ण पथ के साथ दिया जाना चाहिए । यदि कोई आदेश विफल रहता है, तो बाकी नहीं चलाए जाते हैं । A - पथ से पहले सिस्टमड को गैर-शून्य निकास स्थिति को अनदेखा करने के लिए कहता है (इसे विफलता पर विचार करने के बजाय) ।

प्रासंगिक:


उपयोगकर्ता सत्रों के लिए, आप सिस्टमड इकाई बना सकते हैं ~/.config/systemd बजाय. यह 16.04 के साथ काम करना चाहिए, लेकिन सिस्टमड के साथ उबंटू के पहले रिलीज नहीं (क्योंकि वे अभी भी उपयोगकर्ता सत्रों के लिए अपस्टार्ट का उपयोग करते थे) । उपयोगकर्ता सत्र इकाइयों को सिस्टम सेवाओं के समान कमांड के साथ नियंत्रित किया जा सकता है, लेकिन इसके साथ --user विकल्प जोड़ा गया:

systemctl --user daemon-reloadsystemctl --user status foo.service

शैल सिंटैक्स

ध्यान दें कि, अपस्टार्ट के विपरीत, सिस्टमड नहीं चलता है Exec* एक खोल के माध्यम से आदेश । यह कुछ सीमित चर विस्तार और एकाधिक कमांड (द्वारा अलग) करता है ;) स्वयं, लेकिन यह इसके बारे में है जहां तक शेल-जैसे सिंटैक्स जाता है । कुछ भी अधिक जटिल के लिए, पुनर्निर्देशन या पाइप कहें, अपने आदेश को लपेटें sh -c '...' या bash -c '...'.


1लंबे समय तक रहने वाले डेमॉन के विपरीत ।

स्वचालित रूप से कमांड चलाने के विभिन्न तरीके हैं:

  1. अपस्टार्ट सिस्टम उन सभी लिपियों को निष्पादित करेगा जिनसे यह निर्देशिका में कॉन्फ़िगरेशन पाता है /etc/init. ये स्क्रिप्ट सिस्टम स्टार्टअप के दौरान चलेंगी (या कुछ घटनाओं के जवाब में, जैसे, एक शटडाउन अनुरोध) और इसलिए कमांड चलाने का स्थान है जो उपयोगकर्ता के साथ बातचीत नहीं करते हैं; सभी सर्वर इस तंत्र का उपयोग करना शुरू कर रहे हैं ।

    आप एटी के लिए एक पठनीय परिचय पा सकते हैं: http://upstart.ubuntu.com/getting-started.html द मैन पेज man 5 init और man 8 init आपको पूरी जानकारी दें।

  2. नाम की एक शेल स्क्रिप्ट .gnomerc आपके होम डायरेक्टरी में हर बार जब आप गनोम सेशन में लॉग इन करते हैं तो स्वचालित रूप से सोर्स किया जाता है । आप वहां मनमानी आदेश डाल सकते हैं; इस स्क्रिप्ट में आपके द्वारा सेट किए गए पर्यावरण चर आपके सत्र में चलने वाले किसी भी प्रोग्राम द्वारा देखे जाएंगे ।

    ध्यान दें कि सत्र तब तक शुरू नहीं होता है .gnomerc स्क्रिप्ट समाप्त हो गई है; इसलिए, यदि आप कुछ लंबे समय से चल रहे प्रोग्राम को ऑटोस्टार्ट करना चाहते हैं, तो आपको संलग्न करना होगा & प्रोग्राम इनवोकेशन के लिए, इसे रनिंग शेल से अलग करने के लिए ।

  3. मेनू विकल्प प्रणाली -> प्राथमिकताएं -> स्टार्टअप अनुप्रयोगों आपको यह परिभाषित करने की अनुमति देता है कि आपका ग्राफिकल सत्र शुरू होने पर कौन से एप्लिकेशन शुरू किए जाने चाहिए (उबंटू काफी कुछ पूर्वनिर्धारित करता है), और उन्हें अपने स्वाद में जोड़ें या निकालें । इसका लगभग एक ही उद्देश्य और दायरा है .gnomerc स्क्रिप्ट, सिवाय आपको जानने की जरूरत नहीं है sh सिंटैक्स (लेकिन न तो आप किसी का उपयोग कर सकते हैं sh प्रोग्रामिंग निर्माण) ।

$HOME/.config/autostart स्टार्टअप एप्लिकेशन सूची शामिल है । .desktop इस फ़ोल्डर में फ़ाइलें स्टार्टअप पर निष्पादित की जाएंगी । इसे निष्पादन योग्य अनुमति की आवश्यकता हो सकती है (chmod +x startup.desktop).

के लिए नमूना उदाहरण .desktop फ़ाइल:

[Desktop Entry]Type=ApplicationExec="</path/to/script>"Hidden=falseNoDisplay=falseX-GNOME-Autostart-enabled=trueName=Startup Script

यहाँ "</path/to/script>" आपके लिए पथ के साथ बदल दिया गया है script.shयदि आप अपनी स्क्रिप्ट रखते हैं myscript में /usr/local/bin ताकि इसे सीधे कमांड द्वारा निष्पादित किया जा सके, आप लिख सकते हैं myscript के बजाय "</path/to/script>".

का नमूना उदाहरण myscript.sh:

#!/bin/bash<commands to be executed>exit

परिणाम:.desktop फाइल से शुरू किया जाएगा $HOME/.config/autostart जो स्क्रिप्ट को निष्पादित करता है Exec=

साधारण चीजों के लिए आप एक कमांड जोड़ सकते हैं >>सिस्टम-प्राथमिकताएं-सत्र अपनी स्क्रिप्ट के स्थान की ओर इशारा करते हुए ।

वैकल्पिक रूप से आप इसे /आदि/इनिट में जोड़ सकते हैं । d/rc.स्थानीय या एक अपस्टार्ट नौकरी अगर यह एक और अधिक है निम्न स्तर सामान।

पर एक नज़र रखना https://help.ubuntu.com/community/UbuntuBootupHowto अधिक जानकारी के लिए

cron उत्तर शीर्ष मतदान से अलग लागू किया गया

यह उत्तर अभी भी उपयोग करता है cron लेकिन शीर्ष मतदान उत्तर की तुलना में एक अलग विधि का उपयोग करता है । यह उबंटू 16.04 के बाद से काम करता है लेकिन शायद बहुत जल्द समर्थित है । यह सिर्फ इतना है कि मैंने उपयोग करना शुरू कर दिया cron 16.04 के बाद से कंप्यूटर बूट होने पर नौकरी चलाने के लिए ।

कब करता है cron भागो?

टिप्पणियों में किसी ने पूछा;वे कब दौड़ते हैं?". आप बता सकते हैं में syslog / journalctl:

$ journalctl -b | grep cronJan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[985]: (root) CMD (   /usr/local/bin/cron-reboot-cycle-grub-background)Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user rootJan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user rootJan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root

ध्यान देने वाली एक बात है cron आप नौकरी चलाने की स्थिति ईमेल कर सकते हैं और @reboot नौकरियां इतनी जल्दी नेटवर्क प्रबंधक चलाने के लिए और ईमेल जब तक आप एक डाल नहीं चल रहा होगा sleep अपनी स्क्रिप्ट में कमांड करें ।

अपनी स्क्रिप्ट कहां रखें

निर्देशिका में अपनी स्क्रिप्ट रखो /etc/cron.d:

$ ll /etc/cron.dtotal 44drwxr-xr-x   2 root root  4096 Nov 26 19:53 ./drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../-rw-r--r--   1 root root   244 Dec 28  2014 anacron-rw-r--r--   1 root root   148 Feb 18  2017 cycle-grub-background-rw-r--r--   1 root root   138 Mar  5  2017 display-auto-brightness-rw-r--r--   1 root root   460 Nov 26 19:53 nvidia-hdmi-sound-rw-r--r--   1 root root   102 Feb  9  2013 .placeholder-rw-r--r--   1 root root   224 Nov 19  2016 touch-vmlinuz-rw-r--r--   1 root root   700 Aug  5 11:15 turn-off-hyper-threading

एक स्क्रिप्ट कैसी दिखती है?

यहां कुछ स्क्रिप्ट हैं जिन्हें मैंने प्रत्येक बूट को चलाने के लिए सेटअप किया है:

$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin @reboot   root    /usr/local/bin/cron-reboot-cycle-grub-background$ cat /etc/cron.d/touch-vmlinuzSHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin@reboot   root    touch "/boot/vmlinuz-"`uname -r`

आपको उपयोग करना चाहिए अपस्टार्ट इसके लिए । अपस्टार्ट का उपयोग उबंटू प्रक्रियाओं के लिए किया जाता है जो स्वचालित रूप से शुरू होती हैं । यह पुराने सिस्टम-वी इनिट की तरह एक बढ़ाया समाधान है । d लिपियों. यह आपको अपनी स्क्रिप्ट की शुरुआत में पूर्वापेक्षाएँ डालने की भी अनुमति देता है (यानी क्या आपको नेटवर्क चलाने की आवश्यकता है? आदि । )

यदि आप कर्नेल शुरू होने के ठीक बाद सिस्टमड से पहले अपनी स्क्रिप्ट चलाना चाहते हैं, तो जिस तरह से जोड़ रहा है init=/path/to/script कर्नेल कमांड लाइन में /boot/grub/grub.cfg या अधिक भविष्य के सबूत में अपनी खुद की मेनू प्रविष्टि करें /etc/grub.d/40_custom से एक मेनू प्रविष्टि की प्रतिलिपि बनाकर /boot/grub/grub.cfg और आवश्यक परिवर्तन करना (और चल रहा है update-grub उसके बाद के लिए grub अपनी कस्टम फ़ाइल को इसमें जोड़ने के लिए /boot/grub/grub.cfg).

linux   /boot/vmlinuz-5.4.0-26-generic ... ro  quiet splash 

में बदलें

linux   /boot/vmlinuz-5.4.0-26-generic ... ro  quiet splash init=/path/to/script

ठीक से रखने के लिए ध्यान रखें उदा । #!/bin/bash पहली पंक्ति पर और exec /sbin/init (यदि /sbin/init आपके सिस्टम पर मौजूद है - मेरा यह सिस्टमड को इंगित करता है) कर्नेल आतंक से बचने के लिए अंत में ।

अगर कोई यह भी दिखा सकता है कि कब और कहाँ दोनों भयानक होंगे । मैं ऐसा इसलिए कहता हूं क्योंकि मुझे पता है कि स्क्रिप्ट शुरू करने के कम से कम 2 तरीके हैं जो अन्य अनुप्रयोगों के शुरू होने से पहले आग लग जाएंगे (जैसे एक्स 11)

  • 1 से @गेब्रियलफेयर। समस्या का एक बड़ा हिस्सा यह है कि मूल प्रश्न और उत्तर दस साल पुराने हैं । मैं यह भी जोड़ूंगा कि इस समस्या को हल करने के कई तरीके हैं । यूनिक्स दर्शन की सादगी का क्या हुआ?! किसी को * जानकार * का अनुरोध करें और पर्याप्त बिंदुओं के साथ इस पोस्ट को फिर से लिखें, या आधुनिक ओएस संस्करणों के लिए एक नया, अद्यतित, निश्चित उत्तर जोड़ें ।

यह पूरा उत्तर धागा एक गड़बड़ है । स्टैक एक्सचेंज प्रारूप इस प्रश्न के लिए सबसे उपयुक्त नहीं लगता है