كيف يمكنني تشغيل البرامج النصية تلقائيا عندما يبدأ أوبونتو حتى أنا لم يكن لديك لتشغيلها يدويا بعد بدء التشغيل?
نهج واحد هو إضافة @إعادة التشغيل كرون المهمة:
- تشغيل
crontab -e
سوف تسمح لك لتحرير كرون الخاص بك. -
إضافة خط مثل هذا إليه:
@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
هو ديفيند في johndoe
s ~/.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على عكس الشياطين طويلة العمر.
هناك طرق مختلفة لتشغيل الأوامر تلقائيا:
-
ال مغرور سيقوم النظام بتنفيذ جميع البرامج النصية التي يعثر منها على تكوين في الدليل
/etc/init
. سيتم تشغيل هذه البرامج النصية أثناء بدء تشغيل النظام (أو استجابة لأحداث معينة ، على سبيل المثال ، طلب إيقاف التشغيل) وكذلك المكان المناسب لتشغيل الأوامر التي لا تتفاعل مع المستخدم ؛ يتم بدء تشغيل جميع الخوادم باستخدام هذه الآلية.يمكنك العثور على مقدمة قابلة للقراءة في: http://upstart.ubuntu.com/getting-started.html صفحات الرجل
man 5 init
وman 8 init
أعطيك التفاصيل الكاملة. -
نص قذيفة اسمه
.gnomerc
في الدليل الرئيسي الخاص بك هو مصدرها تلقائيا في كل مرة تقوم فيها بتسجيل الدخول إلى جلسة جنوم. يمكنك وضع الأوامر التعسفية في هناك ؛ سوف ينظر متغيرات البيئة التي قمت بتعيينها في هذا البرنامج النصي من قبل أي برنامج تقوم بتشغيله في جلسة العمل الخاصة بك.لاحظ أن الجلسة لا تبدأ حتى
.gnomerc
الانتهاء من البرنامج النصي ؛ لذلك ، إذا كنت ترغب في تشغيل تلقائي بعض البرامج طويلة الأمد ، تحتاج إلى إلحاق&
إلى استدعاء البرنامج ، من أجل فصله عن قذيفة قيد التشغيل. خيار القائمة تطبيقات بدء التشغيل يسمح لك لتحديد ما يجب أن تبدأ التطبيقات عندما تبدأ جلسة رسومية الخاص بك (أوبونتو يحدد مسبقا بعض جدا) ، وإضافة أو إزالتها لذوقك. هذا له نفس الغرض تقريبا ونطاق
.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 إلى @ غابرييلفير. جزء كبير من المشكلة هو أن السؤال الأصلي والجواب هي عشر سنوات من العمر. أود أن أضيف أيضا أن هناك العديد من الطرق لحل هذه المشكلة. ماذا حدث لبساطة فلسفة يونكس?! طلب شخص * المعرفة * ومع نقاط كافية إعادة كتابة هذا المنصب ، أو إضافة جديدة ، ما يصل إلى تاريخ ، إجابة نهائية لإصدارات نظام التشغيل الحديثة.
هذا الموضوع الجواب بأكمله هو فوضى. لا يبدو أن تنسيق تبادل المكدس هو الأنسب لهذا السؤال