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


520

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


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

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

1
यह वास्तव में काफी मनोरंजक है। कितने अलग-अलग तरीके हो सकते हैं?
devios1

जवाबों:


206

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

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

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

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

start on startup
task
exec /path/to/command

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


58
यह देखते हुए कि एसओ और स्टैक एक्सचेंज कैसे चलते हैं, क्या आप एक अपस्टार्ट स्क्रिप्ट का उदाहरण दे सकते हैं और इसे कहां रखा जाएगा? यह एक बेहतर जवाब होगा। आपके लिंक का कहना है कि इसका रखरखाव नहीं किया जा रहा है और अपस्टार्ट कुकबुक को देखने के लिए, जो कि हुयुंग है। मुझे पता नहीं है कि कहां से शुरुआत करनी है।
एहतेश चौधरी

2
क्या होगा अगर मुझे कमांड को रूट के रूप में चलाने की आवश्यकता है?
डोपाट्रमण

1
@dopatraman उत्तर में कहा गया है कि इसके साथ सभी प्रक्रियाएँ रूट के रूप में चलाई जाती हैं।
एस्फोटो

4
कृपया अपस्टार्ट (Ubuntu 15.04+) के बजाय सिस्टम पर चलने वाले सिस्टम पर क्या करें, यह समझाने के लिए इस उत्तर को अपडेट करें।

3
इस जवाब से मुझे कोई मतलब नहीं है। में सूचीबद्ध अनुप्रयोगों system->pref->startup applicationsको न तो अंदर पाया जा सकता है /etc/init/और न ही अंदर ~/.config/upstart। तो स्टार्टअप एप्लिकेशन को कहां परिभाषित किया गया है?
ब्लाहिरन

553

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

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

    @reboot /path/to/script
    

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


85
@rebootकीवर्ड एक अच्छा टिप क्योंकि यह व्यापक रूप से ज्ञात नहीं है।
१२:३० बजे १२'१०

12
अच्छा लगा। किसी भी विचार बिल्कुल जब यह चलाता है?
ओली

2
तो ... यह नहीं चलेगा अगर मैं बिजली खो गया और पीसी फिर से चालू हो गया जब बिजली बहाल हो गई?
माइक विल्स

18
@ सियामई: man 5 crontabकहता है कि @rebootस्टार्टअप पर अमल किया जाता है (जब क्रोन डेमॉन शुरू किया जाता है)।
JFS

9
यह कमाल का है। अब तक यह इस rc.localप्रणाली (PATH, आदि) द्वारा अधिक सेटअप लगता है की तुलना में बेहतर है । यह अजीब है कि सिस्टम स्टार्टअप के बाद कुछ कॉल करना इतना कठिन है ..
कार्तिक टी

161

कमांड को जोड़ने के बारे में कैसे /etc/rc.local? हालाँकि आपको इस फ़ाइल को संपादित करने के लिए sudo एक्सेस का उपयोग करना होगा।

sudo nano /etc/rc.local

19
यह सबसे सीधे सवाल का जवाब देता है: कैसे कुछ स्क्रिप्ट को निष्पादित करने के लिए जब आपके सिस्टम बूट करता है। अपस्टार्ट एक अधिक जटिल कार्य करता है: डेमॉन प्रक्रियाओं को शुरू करता है।
डॉगवॉटर

1
इसलिए अपस्टार्ट डेमॉन प्रोसेस शुरू करता है जबकि /etc/rc.local स्क्रिप्ट्स को शुरू करता है?
डोनाटो

5
इसे होना चाहिए? यह अब इन दिनों काम करता है, है ना?
डेविस

4
Ubuntu 17.04 systemd
qodeninja

3
ध्यान दें कि यदि आप इस फ़ाइल को स्वयं बनाते हैं (जैसे मैंने किया था), तो आपको फ़ाइल को निष्पादन योग्य में बदलना होगा chmod 755 rc.local, और #!/bin/bashपहली पंक्ति में जोड़ना होगा।
Psitae

77

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

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

[Unit]
Description=Job that runs your user script

[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

तो भागो:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

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

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

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

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

से मिलता जुलता:


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

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

शैल सिंटैक्स

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


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


क्या नौकरी पर प्राथमिकता तय करना संभव है? या निर्दिष्ट करें कि यह पहले शुरू की जाने वाली किसी अन्य सेवा पर निर्भर करता है?
r3wt

1
@ r3wt हां, ऐसा करने के अलग-अलग तरीके हैं। WantedByउदाहरण के लिए, इसका उपयोग तब किया multi-user.targetजाता है जब यह पहुंच जाता है। आप उपयोग कर सकते हैं Before, After, Requires, आदि देखेंman systemd.unit
muru

@PerlDuck में केवल एक चीज की कमी नहीं थी। धन्यवाद!
मुरु

आपका स्वागत है। - Btw, RemainAfterExitआपके द्वारा शुरू की गई सेवा और उसके इच्छित व्यवहार पर निर्भर करता है। उदाहरण के लिए, /bin/df -h<s> के पास होना चाहिए RemainAfterExit=no
पर्लडक

@PerlDuck dfउस जरूरतों में निहित कुछ भी नहीं है RemainAfterExit=no। जब तक आप हर बार आपके द्वारा चलाए जाने वाले आदेश को बार-बार निष्पादित नहीं करना चाहते हैं systemctl start foo
मुरु

71

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

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

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

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

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

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


11
3) "यह लगभग एक ही उद्देश्य और .gnomerc स्क्रिप्ट का दायरा है", .gnomercस्पष्ट रूप से एकता को लोड करने से पहले चलाता है , और Startup Applicationsजाहिर तौर पर एकता को लोड करने के बाद चलता है । मुझे एक प्रोग्राम चलाना था जो यूनिटी के मेन्यू बार पर बैठता है और इस मामले में बहुत फर्क पड़ा!
वह ब्राजील के लड़के

1
@ ruda.almeida इस ओर इशारा करने के लिए धन्यवाद। उत्तर पूर्व-एकता के दिनों में लिखा गया था।
रिकार्डो मुर्री

1
sudo update-rc.d myscript.sh defaults, जहां /etc/init.d/myscript.sh आपकी स्क्रिप्ट है, इसे स्टार्टअप पर भी चलाता है।
Dan Dascalescu

27
$HOME/.config/autostart
  • इस स्थान में स्टार्टअप एप्लिकेशन सूची है।
  • .desktop फ़ाइल को यहां रखा जा सकता है जिसे स्टार्टअप पर निष्पादित किया जाएगा।

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

निम्नलिखित .desktopफ़ाइल में $HOME/.config/autostartऔर दिया जा रहा है chmod +x:

[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script

यहाँ "</path/to/script>"आपके लिए पथ के साथ प्रतिस्थापित किया जाता है script.sh
(आमतौर पर /usr/local/binऐसा करने के लिए अनुशंसित -जिसे सीधे कमांड द्वारा myscriptप्रतिस्थापित किया जा सकता है "</path/to/script>")।

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

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

परिणाम: .desktopफ़ाइल लॉन्च होगी $HOME/.config/autostartजिसमें से स्क्रिप्ट निष्पादित करेंExec=

इसलिए, आप अपने इच्छित शेल स्क्रिप्ट को स्टार्टअप पर चला सकते हैं!


18

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

वैकल्पिक रूप से आप इसे /etc/init.d/rc.local में जोड़ सकते हैं या यदि यह अधिक उच्च स्तरीय सामान है तो अपस्टार्ट कार्य कर सकते हैं ।

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


7

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

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

कब cronचलता है?

टिप्पणियों में किसी ने पूछा "वे कब चलते हैं?"। आप syslog / journalctl में बता सकते हैं:

$ journalctl -b | grep cron
Jan 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-02
Jan 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 root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 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.d
total 44
drwxr-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/sh
PATH=/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-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    touch "/boot/vmlinuz-"`uname -r`

1
क्रोनजॉब्स को जोड़ने के कई अलग-अलग तरीके हैं, लेकिन अत्यधिक वोट किए गए उत्तर का मूल और आपका उत्तर अभी भी है @reboot
मुरु

Crontabs जोड़ने के लिए वैकल्पिक तरीकों को askubuntu.com/q/2368/158442 पर पोस्ट किया जाना चाहिए , जो स्पष्ट रूप से Cron जॉब्स को जोड़ने के बारे में है।
मुरु

1
क्षमा करें मैं असहमत हूं। प्रश्न में उत्तर का मूल उपयोग करता है, crontab -eजो कुछ विंब-जैसे इंटरफ़ेस के कारण काली कलाओं में से एक मानते हैं। दूसरी ओर यह उत्तर उन लोगों के लिए अपील कर सकता है जिनके दिमाग को एक निश्चित तरीके से तार दिया जाता है। हम सभी एक ही साँचे से नहीं ढले हैं। तो फिर से इस जवाब में पहले से ही एक नीचे वोट है तो हम लोकतंत्र को उसका कोर्स करने देंगे।
विनयुनुच्स

2
ओह कृपया। आप और मैं दोनों जानते हैं कि संपादक को बदला जा सकता है।
मुरु

@ मुरू हां, क्योंकि आपने मुझे पढ़ाया है और मैंने संपादक को नैनो या कुछ अन्य सीएलआई जैसे कुछ को बदलना सीखा। लेकिन मैं gedit शिविर में हूँ। इसके अलावा crontab -eमिनट, घंटे, आदि के लिए तारांकन ("*") की यादें लाता है, जो मैंने हमेशा पाया है कि मुझे इसके लिए Google निर्देशों की आवश्यकता है। मैं अभी भी खोज कर रहा हूं /etc/cron.dऔर /etc/cron.dailyमेरी पसंद का है। खासकर जब से यह दर्पण /etc/udev/rules.dऔर /etc/systemd/system-sleepतरीके। यह सिर्फ एक अच्छा फिट की तरह लगता है।
विनयुनुच्स

5

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.