जब उबंटू शुरू होता है तो मैं स्वचालित रूप से स्क्रिप्ट कैसे चला सकता हूं इसलिए मुझे स्टार्टअप के बाद उन्हें मैन्युअल रूप से चलाने की आवश्यकता नहीं है?
जब उबंटू शुरू होता है तो मैं स्वचालित रूप से स्क्रिप्ट कैसे चला सकता हूं इसलिए मुझे स्टार्टअप के बाद उन्हें मैन्युअल रूप से चलाने की आवश्यकता नहीं है?
जवाबों:
इस पर निर्भर करता है कि आपको किस प्रकार की स्क्रिप्ट चलाने की आवश्यकता है .. सेवाओं और इस तरह आपको अपस्टार्ट का उपयोग करना चाहिए । लेकिन एक यूजर स्क्रिप्ट के लिए इन्हें गनोम द्वारा सत्र स्क्रिप्ट के रूप में लॉन्च किया जाना चाहिए! सिस्टम> प्राथमिकता> स्टार्टअप एप्लिकेशन के तहत एक नज़र डालें।
साइड नोट पर अगर आपको टर्मिनल लॉगिन पर चलने के लिए कुछ स्क्रिप्ट की आवश्यकता है तो आप उन्हें अपने होम निर्देशिका में .bash_login फ़ाइल में जोड़ सकते हैं ।
एक साधारण कमांड (जिसे चलाने की आवश्यकता नहीं है) एक अपस्टार्ट नौकरी का उपयोग कर सकता है जैसे:
start on startup
task
exec /path/to/command
इसे एक .conf
फाइल में सेव करें /etc/init
(यदि आपको सिस्टम बूट होने पर रूट के रूप में चलाने के लिए इसकी आवश्यकता है), या ~/.config/upstart
(यदि आपको लॉग इन करते समय इसे अपने उपयोगकर्ता के रूप में चलाने की आवश्यकता है)।
system->pref->startup applications
को न तो अंदर पाया जा सकता है /etc/init/
और न ही अंदर ~/.config/upstart
। तो स्टार्टअप एप्लिकेशन को कहां परिभाषित किया गया है?
एक दृष्टिकोण @reboot क्रोन कार्य को जोड़ना है :
crontab -e
आपको अपने क्रोन को संपादित करने की अनुमति देगा।इस तरह एक लाइन जोड़ना:
@reboot /path/to/script
आपके कंप्यूटर के बूट होने के बाद वह स्क्रिप्ट निष्पादित करेगा।
@reboot
कीवर्ड एक अच्छा टिप क्योंकि यह व्यापक रूप से ज्ञात नहीं है।
man 5 crontab
कहता है कि @reboot
स्टार्टअप पर अमल किया जाता है (जब क्रोन डेमॉन शुरू किया जाता है)।
rc.local
प्रणाली (PATH, आदि) द्वारा अधिक सेटअप लगता है की तुलना में बेहतर है । यह अजीब है कि सिस्टम स्टार्टअप के बाद कुछ कॉल करना इतना कठिन है ..
कमांड को जोड़ने के बारे में कैसे /etc/rc.local
? हालाँकि आपको इस फ़ाइल को संपादित करने के लिए sudo एक्सेस का उपयोग करना होगा।
sudo nano /etc/rc.local
chmod 755 rc.local
, और #!/bin/bash
पहली पंक्ति में जोड़ना होगा।
का उपयोग करते हुए स्टार्टअप पर एक (अल्पकालिक) 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 लंबे समय तक रहने वाले डेमन के विपरीत।
WantedBy
उदाहरण के लिए, इसका उपयोग तब किया multi-user.target
जाता है जब यह पहुंच जाता है। आप उपयोग कर सकते हैं Before
, After
, Requires
, आदि देखेंman systemd.unit
RemainAfterExit
आपके द्वारा शुरू की गई सेवा और उसके इच्छित व्यवहार पर निर्भर करता है। उदाहरण के लिए, /bin/df -h
<s> के पास होना चाहिए RemainAfterExit=no
।
df
उस जरूरतों में निहित कुछ भी नहीं है RemainAfterExit=no
। जब तक आप हर बार आपके द्वारा चलाए जाने वाले आदेश को बार-बार निष्पादित नहीं करना चाहते हैं systemctl start foo
।
स्वचालित रूप से कमांड चलाने के विभिन्न तरीके हैं:
नवोदय की व्यवस्था जिसमें से यह निर्देशिका में एक विन्यास पाता सभी स्क्रिप्ट निष्पादित करेंगे /etc/init
। ये स्क्रिप्ट सिस्टम स्टार्टअप के दौरान चलेंगे (या कुछ घटनाओं के जवाब में, उदाहरण के लिए, शटडाउन अनुरोध) और इसलिए कमांड चलाने के लिए जगह है जो उपयोगकर्ता के साथ बातचीत नहीं करते हैं; सभी सर्वर इस तंत्र का उपयोग करने लगे हैं।
तुम पर एक पठनीय परिचय पा सकते हैं: http://upstart.ubuntu.com/getting-started.html आदमी पृष्ठों man 5 init
और man 8 init
आप पूरी जानकारी दे।
.gnomerc
आपके होम डायरेक्टरी में नामित शेल स्क्रिप्ट आपके द्वारा गनोम सत्र में लॉग इन करने पर हर बार स्वचालित रूप से खट्टी हो जाती है। आप वहां मनमाना आदेश डाल सकते हैं; पर्यावरण चर जो आप इस स्क्रिप्ट में सेट करते हैं, आप अपने सत्र में चलने वाले किसी भी कार्यक्रम को देखेंगे।
ध्यान दें कि .gnomerc
स्क्रिप्ट समाप्त होने तक सत्र शुरू नहीं होता है; इसलिए, यदि आप कुछ लंबे चलने वाले प्रोग्राम को ऑटोस्टार्ट करना चाहते हैं, तो आपको &
रनिंग शेल से अलग करने के लिए, प्रोग्राम इनवोकेशन में संलग्न करना होगा।
मेनू विकल्प सिस्टम -> प्राथमिकताएं -> स्टार्टअप एप्लिकेशन आपको यह परिभाषित करने की अनुमति देता है कि आपके ग्राफिकल सत्र के शुरू होने पर क्या अनुप्रयोग शुरू होने चाहिए (उबंटू पूर्वनिर्धारित कुछ काफी), और उन्हें अपने स्वाद में जोड़ें या निकालें। यह .gnomerc
स्क्रिप्ट का लगभग एक ही उद्देश्य और कार्यक्षेत्र है , सिवाय इसके कि आपको sh
सिंटैक्स जानने की आवश्यकता नहीं है (लेकिन न तो आप किसी sh
प्रोग्रामिंग कंस्ट्रक्शन का उपयोग कर सकते हैं )।
.gnomerc
स्पष्ट रूप से एकता को लोड करने से पहले चलाता है , और Startup Applications
जाहिर तौर पर एकता को लोड करने के बाद चलता है । मुझे एक प्रोग्राम चलाना था जो यूनिटी के मेन्यू बार पर बैठता है और इस मामले में बहुत फर्क पड़ा!
sudo update-rc.d myscript.sh defaults
, जहां /etc/init.d/myscript.sh आपकी स्क्रिप्ट है, इसे स्टार्टअप पर भी चलाता है।
$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=
इसलिए, आप अपने इच्छित शेल स्क्रिप्ट को स्टार्टअप पर चला सकते हैं!
सिंपल चीजों के लिए आप सिस्टम-> प्रेफरेंस-> सेशन्स को अपनी स्क्रिप्ट की लोकेशन की ओर इशारा कर सकते हैं।
वैकल्पिक रूप से आप इसे /etc/init.d/rc.local में जोड़ सकते हैं या यदि यह अधिक उच्च स्तरीय सामान है तो अपस्टार्ट कार्य कर सकते हैं ।
अधिक जानकारी के लिए https://help.ubuntu.com/community/UbuntuBootupHowto पर एक नज़र डालें
cron
उत्तर शीर्ष मतदान से अलग लागू किया गयायह उत्तर अभी भी उपयोग करता है cron
लेकिन शीर्ष मतदान जवाब की तुलना में एक अलग विधि का उपयोग करता है। यह उबंटू 16.04 के बाद से काम करता है, लेकिन शायद बहुत जल्द इसका समर्थन करता है। यह सिर्फ इतना है कि मैंने cron
16.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`
@reboot
।
crontab -e
जो कुछ विंब-जैसे इंटरफ़ेस के कारण काली कलाओं में से एक मानते हैं। दूसरी ओर यह उत्तर उन लोगों के लिए अपील कर सकता है जिनके दिमाग को एक निश्चित तरीके से तार दिया जाता है। हम सभी एक ही साँचे से नहीं ढले हैं। तो फिर से इस जवाब में पहले से ही एक नीचे वोट है तो हम लोकतंत्र को उसका कोर्स करने देंगे।
crontab -e
मिनट, घंटे, आदि के लिए तारांकन ("*") की यादें लाता है, जो मैंने हमेशा पाया है कि मुझे इसके लिए Google निर्देशों की आवश्यकता है। मैं अभी भी खोज कर रहा हूं /etc/cron.d
और /etc/cron.daily
मेरी पसंद का है। खासकर जब से यह दर्पण /etc/udev/rules.d
और /etc/systemd/system-sleep
तरीके। यह सिर्फ एक अच्छा फिट की तरह लगता है।
आपको इसके लिए upstart का उपयोग करना चाहिए । अपस्टार्ट का उपयोग Ubuntu प्रक्रियाओं के लिए किया जाता है जो स्वचालित रूप से शुरू हो जाते हैं। यह पुराने System-V init.d स्क्रिप्ट की तरह एक बढ़ा हुआ समाधान है। यह आपको अपनी स्क्रिप्ट की शुरुआत में पूर्वापेक्षाएँ देने की अनुमति देता है (यानी आपको नेटवर्क चलाने की आवश्यकता है? आदि)