سؤال كيفية تشغيل البرامج النصية عند بدء التشغيل؟


كيف يمكنني تشغيل البرامج النصية تلقائيا عندما يبدأ تشغيل Ubuntu لذا لا يتعين علي تشغيلها يدويًا بعد بدء التشغيل؟


456
2017-08-04 19:54


الأصل


إذا كان بإمكان أحد الأشخاص أيضًا عرض كل من WHEN و WHERE فسيكون ذلك رائعًا. أقول هذا لأنني أعرف أن هناك طريقتين على الأقل لبدء تشغيل برنامج نصي قبل إطلاق التطبيقات الأخرى (مثل X11) - Buttink
هذا كله موضوع الإجابة هي فوضى. يبدو أن تنسيق Stack Exchange غير مناسب لهذا السؤال - Gabriel Fair
انها في الواقع مسلية جدا. كم عدد الطرق المختلفة التي يمكن أن توجد؟ - devios1


الأجوبة:


اعتمادا على نوع البرامج النصية التي تحتاج إلى تشغيل .. للخدمات وما شابه يجب عليك استخدامها مغرور. ولكن بالنسبة لنصوص المستخدم ، يجب إطلاقها كنصوص برمجية بواسطة gnome! ألقِ نظرة على النظام> التفضيلات> تطبيقات بدء التشغيل.

في ملاحظة جانبية إذا كنت تحتاج إلى تشغيل بعض البرامج النصية على تسجيل الدخول إلى المحطة الطرفية ، يمكنك إضافتها إلى .bash_login ملف في دليل منزلك.

عن 14.04 وما فوق

يمكن أن يستخدم أمر بسيط (واحد لا يحتاج للبقاء قيد التشغيل) وظيفة مبتدئة مثل:

start on startup
task
exec /path/to/command

احفظ هذا في .conf إملأ /etc/init (إذا كنت بحاجة إلى تشغيله كجذر عند تشغيل النظام للأعلى) أو في ~/.config/upstart (إذا إحتجت إلى ذلك لتشغيل كمستخدم عند تسجيل الدخول).


191
2017-08-04 23:26



بالنظر إلى كيفية تشغيل SO و StackExchange ، هل يمكن أن تعطي مثالاً على نص برمجي مغرور وأين سيتم وضعه؟ من شأنه أن يجعل هذا إجابة أفضل بكثير. يقول الرابط الخاص بك أنه لا يتم الحفاظ عليها وإلقاء نظرة على كتاب الطبخ مغرور ، وهو huuuge. ليس لدي الكثير من فكرة من أين تبدأ. - Ehtesh Choudhury
ماذا لو كنت بحاجة إلى تشغيل الأمر كجذر؟ - dopatraman
dopatraman تنص الإجابة على أن جميع العمليات مع هذا يتم تشغيلها كجذر. - cybermonkey
يرجى تحديث هذه الإجابة لشرح ما يجب القيام به على الأنظمة التي تستخدم systemd بدلاً من المبتدئين (Ubuntu 15.04+).
هذا الجواب لا يعقلني. التطبيقات المدرجة في system->pref->startup applications لا يمكن العثور عليها /etc/init/ ولا في ~/.config/upstart. وبالتالي أين يتم تحديد تطبيقات بدء التشغيل؟ - Blauhirn


نهج واحد هو إضافةreboot كرون مهمة:

  1. جري crontab -e سيسمح لك بتحرير كرون الخاص بك.
  2. إضافة خط مثل هذا إلى:

    @reboot /path/to/script
    

    سيقوم بتنفيذ هذا البرنامج النصي بمجرد تشغيل جهاز الكمبيوتر الخاص بك.


476
2017-08-04 19:57



ال @reboot الكلمة الرئيسية هي نصيحة لطيفة لأنها ليست معروفة على نطاق واسع. - jathanism
لطيف. اي فكرة بالضبط عندما هذا يطلق؟ - Oli♦
لذلك ... لن يتم تشغيل هذا إذا فقدت الطاقة وتحول الكمبيوتر مرة أخرى عند استعادة الطاقة؟ - Mike Wills
siamii: man 5 crontab يقول ان @reboot يتم تنفيذه عند بدء التشغيل (عند بدء تشغيل cron daemon). - jfs
هذا رائع. حتى الآن يبدو هذا أفضل من rc.local نظرًا لأن النظام يبدو أكثر إعدادًا عند هذه النقطة (PATH ، إلخ). من الغريب أنه من الصعب جدا تسمية شيء ما بعد بدء تشغيل النظام.. - Karthik T


ماذا عن إضافة الأمر إلى /etc/rc.local؟ سيكون عليك استخدام sudo access لتحرير هذا الملف.

sudo nano /etc/rc.local

135
2017-08-05 16:40



هذا يجيب على الأكثر مباشرة السؤال: كيفية ببساطة تنفيذ بعض البرامج النصية عند قيام النظام بالتمهيد. مبتدئ يقوم بمهمة أكثر تعقيدًا: بدء عمليات خفية. - Dogweather
هكذا تبدأ مغرور عمليات الخفي في حين /etc/rc.local يبدأ سكريبتات باش؟ - Donato
هذا يجب أن يكون الجواب المقبول ... - Android Dev
ينبغي له؟ هذا لم يعد يعمل هذه الأيام ، أليس كذلك؟ - DaVince
يعمل Doenst مع Ubuntu 17.04 systemd - qodeninja


هناك طرق مختلفة لتشغيل الأوامر تلقائيًا:

  1. ال مغرور سيقوم النظام بتنفيذ جميع البرامج النصية التي من خلالها يجد التكوين في الدليل /etc/init. سيتم تشغيل هذه البرامج النصية أثناء بدء تشغيل النظام (أو استجابة لأحداث معينة ، على سبيل المثال ، طلب إيقاف التشغيل) ، وكذلك مكان تشغيل الأوامر التي لا تتفاعل مع المستخدم ؛ جميع الخوادم تبدأ باستخدام هذه الآلية.

    يمكنك العثور على مقدمة قابلة للقراءة في: http://upstart.ubuntu.com/getting-started.html صفحات الرجل man 5 init و man 8 init يعطيك التفاصيل الكاملة.

  2. برنامج نصي قذيفة يدعى .gnomerc في دليل منزلك يتم الحصول عليه تلقائيًا في كل مرة تسجل فيها الدخول إلى جلسة جنوم. يمكنك وضع أوامر عشوائية هناك ؛ سيتم عرض متغيرات البيئة التي قمت بتعيينها في هذا البرنامج النصي بواسطة أي برنامج تقوم بتشغيله في جلسة العمل الخاصة بك.

    لاحظ أن الجلسة لا تبدأ حتى .gnomerc اكتمل النص البرمجي لذلك ، إذا كنت تريد تشغيل بعض البرامج التي تعمل لفترة طويلة ، فستحتاج إلى إلحاقها & إلى استدعاء البرنامج ، من أجل فصلها عن shell قيد التشغيل.

  3. خيار القائمة النظام -> التفضيلات -> تطبيقات بدء التشغيل يسمح لك بتحديد التطبيقات التي يجب أن تبدأ عند بدء الجلسة الرسومية الخاصة بك (يقوم Ubuntu بتحديد بعضها بشكل مسبق) ، وإضافة أو إزالتها حسب ذوقك. هذا له تقريبا نفس الغرض ونطاق .gnomerc النصي ، إلا أنك لست بحاجة إلى معرفة sh بناء الجملة (ولكن لا يمكنك استخدام أي sh بناء البرمجة).


68
2017-08-05 14:02



3) "هذا له نفس الهدف ونطاق النصي .gnomerc" ، باستثناء .gnomerc يدير على ما يبدو قبل تحميل الوحدة ، و Startup Applications يدير على ما يبدو بعد تحميل الوحدة. اضطررت لتشغيل برنامج يجلس على شريط القائمة في Unity وقد أحدثت فرقًا كبيرًا في هذه الحالة! - That Brazilian Guy
@ ruda.almeida شكرًا على الإشارة إلى ذلك. الجواب مكتوب في أيام ما قبل الوحدة. - Riccardo Murri
sudo update-rc.d myscript.sh defaults، حيث /etc/init.d/myscript.sh هو البرنامج النصي الخاص بك ، كما يتم تشغيله عند بدء التشغيل. - Dan Dascalescu


للسنة 15.04 وما بعدها:

لتشغيل (قصير الأجل)1 الأمر عند بدء التشغيل باستخدام systemd ، يمكنك استخدام وحدة 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

أساسا ، هذا هو مجرد تحويل وظيفة مغرور نموذجية إلى نظام واحد (انظر Systemd لمستخدمي Upstart).

يمكنك تشغيل عدة أوامر من نفس ملف الخدمة ، باستخدام عدة ExecStart خطوط:

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

يجب إعطاء الأمر دائمًا مع المسار الكامل. في حالة فشل أي أمر ، لا يتم تشغيل الباقي. ا - قبل أن يخبر المسار systemd تجاهل حالة خروج غير صفرية (بدلاً من اعتباره فشل).

ذو صلة:


لجلسات المستخدم ، يمكنك إنشاء وحدة systemd في ~/.config/systemd في حين أن. يجب أن يعمل هذا مع 16.04 فصاعدًا ، ولكن ليس الإصدارات السابقة من Ubuntu مع systemd (حيث لا تزال تستخدم Upstart لجلسات المستخدم). يمكن التحكم بوحدات جلسة المستخدم بنفس الأوامر كما في خدمات النظام ، ولكن مع --user الخيار مضاف:

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

1على عكس الشياطين المعمرة.


53
2018-01-09 19:21



هل من الممكن وضع أولوية على الوظيفة؟ أو تحديد أنه يعتمد على خدمة أخرى ليبدأ أولا؟ - r3wt
@ r3wt نعم ، هناك طرق مختلفة للقيام بذلك. ال WantedBy المستخدمة هنا ، على سبيل المثال ، يجعلها تبدأ عندما multi-user.target يتم التوصل. يمكنك استخدام Before، After، Requires، وما إلى ذلك انظر man systemd.unit - muru
PerlDuck ليس الشيء الوحيد الذي كان ينقصه. شكر! - muru
على الرحب و السعة. - راجع للشغل ، و RemainAfterExit يعتمد على الخدمة التي تبدأها وسلوكها المطلوب. على سبيل المثال، /bin/df -h <s> هل ينبغي أن يكون </ s> RemainAfterExit=no. - PerlDuck
PerlDuck لا يوجد شيء متأصل في df هذا يحتاج RemainAfterExit=no. إلا إذا كنت ترغب في تنفيذ الأمر بشكل متكرر في كل مرة تقوم بتشغيل systemctl start foo. - muru


$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=

وبالتالي ، يمكنك تشغيل البرنامج النصي shell المطلوب عند بدء التشغيل!


22
2017-07-20 06:14





لأشياء بسيطة يمكنك إضافة أمر في النظام-> تفضيلات> جلسات مشيرا إلى موقع البرنامج النصي الخاص بك.

بدلا من ذلك يمكنك إضافته إلى /etc/init.d/rc.local أو جعل مغرور وظيفة إذا كان أكثر من ذلك مستوى منخفض أمور.

إلقاء نظرة على https://help.ubuntu.com/community/UbuntuBootupHowto لمزيد من المعلومات


18
2017-08-04 19:59





يجب عليك استخدامها مغرور لهذا. يتم استخدام مبتدئ لعمليات Ubuntu التي يتم تشغيلها تلقائيًا. وهو حل معزز مثل النصوص البرمجية System.d V init.d القديمة. كما يسمح لك بوضع المتطلبات الأساسية لبدء تشغيل البرنامج النصي (على سبيل المثال ، هل تحتاج إلى تشغيل الشبكة؟ إلخ)


5
2017-08-04 19:58





cron إجابة نفذت مختلفة من أعلى صوت

هذه الإجابة لا تزال تستخدم cron ولكنه يستخدم طريقة مختلفة عن أفضل إجابة صوتية. هذا يعمل منذ Ubuntu 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`

3
2018-01-03 01:02



هناك العديد من الطرق المختلفة لإضافة cronjobs ، ولكن جوهر الإجابة التصويت للغاية وإجابتك لا يزال @reboot. - muru
يجب أن يتم نشر طرق بديلة لإضافة crontabs إلى askubuntu.com/q/2368/158442، والتي هي صراحة حول إضافة وظائف Cron. - muru
أرجو أن تتغير. جوهر الجواب في السؤال يستخدم crontab -e التي يعتبرها البعض من الفنون السوداء بسبب واجهة شبيهة بالفيم. من ناحية أخرى ، قد يجذب هذا الجواب أولئك الذين يتم توصيل أدمغتهم بطريقة معينة. نحن لا نلقي جميعا من نفس القالب. ثم مرة أخرى هذه الإجابة لديها بالفعل واحدة للتصويت لأسفل ، لذلك سنترك الديمقراطية تأخذ مجراها. - WinEunuuchs2Unix
ارجوك. أنت وأنا على حد سواء نعلم أنه يمكن تغيير المحرر. - muru
muru نعم ربما لأنك علمتني وتعلمت تغيير المحرر إلى شيء مثل nano أو بضع من CLI. لكنني في معسكر gedit. بالإضافة إلى crontab -e يجلب ذكريات العلامات النجمية ("*") للدقائق ، والساعات ، وما إلى ذلك التي أجدها دائمًا أحتاج إلى إرشادات google الخاصة بها. ما زلت أجد استخدام /etc/cron.d و /etc/cron.daily ذهابي إلى الاختيار. خصوصا أنه يعكس /etc/udev/rules.d و /etc/systemd/system-sleep أساليب. يبدو وكأنه نوبة لطيفة. - WinEunuuchs2Unix