كيفية تشغيل البرامج النصية على بدء?

كيف يمكنني تشغيل البرامج النصية تلقائيا عندما يبدأ أوبونتو حتى أنا لم يكن لديك لتشغيلها يدويا بعد بدء التشغيل?

نهج واحد هو إضافة @إعادة التشغيل كرون المهمة:

  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 هو ديفيند في 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

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

يمكنك تشغيل أوامر متعددة من نفس ملف الخدمة ، باستخدام عدة 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=

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

بدلا من ذلك يمكنك إضافته إلى /الخ/الحرف الأول.(د) المنسق المقيم.المحلية أو جعل مغرور وظيفة إذا كان أكثر مستوى منخفض الاشياء.

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

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

هذه الإجابة لا تزال تستخدم cron ولكن يستخدم طريقة مختلفة من أعلى صوت الجواب. هذا يعمل منذ أوبونتو 16.04 ولكن ربما دعمت في وقت أقرب بكثير. انها مجرد أنني بدأت باستخدام cron لتشغيل الوظائف عند تشغيل الكمبيوتر منذ 16.04.

متى cron اركض?

وفي تصريحات سأل أحدهم &مثل;عندما لا تعمل?& مثل;. يمكنك أن تقول في سيسلوغ / جورنالكتل:

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

يجب عليك استخدام مغرور لهذا. يستخدم مغرور لعمليات أوبونتو التي يتم تشغيلها تلقائيا. وهو حل معزز مثل النظام القديم الخامس الحرف الأول.د مخطوطات. كما يسمح لك لوضع المتطلبات الأساسية لبداية البرنامج النصي الخاص بك (أي هل تحتاج إلى تشغيل الشبكة? الخ.)

إذا كنت تريد تشغيل البرنامج النصي الخاص بك قبل سيستيمد مباشرة بعد بدء النواة ، عفيك الطريق هو إضافة 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 إلى @ غابرييلفير. جزء كبير من المشكلة هو أن السؤال الأصلي والجواب هي عشر سنوات من العمر. أود أن أضيف أيضا أن هناك العديد من الطرق لحل هذه المشكلة. ماذا حدث لبساطة فلسفة يونكس?! طلب شخص * المعرفة * ومع نقاط كافية إعادة كتابة هذا المنصب ، أو إضافة جديدة ، ما يصل إلى تاريخ ، إجابة نهائية لإصدارات نظام التشغيل الحديثة.

هذا الموضوع الجواب بأكمله هو فوضى. لا يبدو أن تنسيق تبادل المكدس هو الأنسب لهذا السؤال