كيفية تشغيل برنامج Linux عند بدء التشغيل باستخدام systemd

نشرت: 2022-01-29
نافذة طرفية منمنمة على جهاز كمبيوتر محمول.
فاطماواتي أحمد زينوري / شاترستوك

هل تحتاج إلى تشغيل برنامج Linux عند التمهيد؟ يوفر برنامج systemd طريقة للقيام بذلك على أي توزيعة Linux مع systemd - وهي معظمها هذه الأيام ، بما في ذلك Ubuntu. سنرشدك خلال عملية إنشاء خدمة متكاملة - بل إنها تتحدث إلى المجلة.

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

تشغيل البرامج عند بدء التشغيل

في بعض الأحيان ، يتم ربط البرنامج الذي تقوم بتثبيته على جهاز الكمبيوتر الخاص بك بعملية بدء تشغيل Linux ، بحيث يتم تشغيل البرنامج تلقائيًا في كل مرة يتم فيها تشغيل الكمبيوتر. يمكنك بسهولة تحقيق نفس السلوك مع البرامج والبرامج النصية الخاصة بك ، أو في الواقع أي برنامج آخر موجود على جهاز الكمبيوتر الخاص بك.

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

البرامج التي تعمل في الخلفية تسمى شياطين أو خدمات. يرمز الحرف "d" في نهاية systemd إلى الخفي. في هذه المقالة ، سننشئ خدمة نموذجية. لتحديد جميع المربعات ، يجب أن تكون خدمتنا:

  • متكامل مع systemd من خلال ملف وحدة الخدمة
  • انطلقت عند بدء التشغيل
  • يمكن التحكم فيه باستخدام systemctl ، واجهة التحكم لنظام systemd
  • قادرة على الكتابة إلى المجلة

إنشاء برنامج الخدمة

نحتاج إلى برنامج systemd . سننشئ نصًا بسيطًا يسمى "htg.sh". يستخدم هذا البرنامج التعليمي محرر نصوص Gedit ، ولكن يمكنك استخدام أي محرر نصوص تفضله.

 المس htg.sh
 gedit htg.sh 

الإعلانات

سيتم فتح محرر gedit . انسخ والصق النص التالي في المحرر.

 #! / بن / باش

صدى "htg.service: ## ابتداء من ##" | معلومات systemd-cat -p

في حين :
فعل
TIMESTAMP = $ (التاريخ '+٪ Y-٪ m-٪ d٪ H:٪ M:٪ S')
صدى "htg.service: timestamp $ {TIMESTAMP}" | معلومات systemd-cat -p
ينام 60
فعله

احفظ التغييرات وأغلق المحرر.

htg.sh النصي في محرر gedit

لا يقدم النص الكثير ، ولكن هناك بعض النقاط الجديرة بالملاحظة.

  • يتم تمرير خطي echo عبر systemd-cat ، وهو برنامج يأخذ الإخراج من برنامج ويرسله إلى المجلة. يتم إعطاء الأولوية للمداخلات في المجلة. نحن نستخدم الخيار -p (الأولوية) للإشارة إلى أن رسائلنا هي للمعلومات (المعلومات) فقط. إنها ليست أخطاء أو تحذيرات مهمة.
  • هناك حلقة while لا نهاية لها.
  • يتم تعيين متغير TIMESTAMP على التاريخ والوقت الحاليين. يتم تنسيق هذا في رسالة وإرسالها إلى المجلة.
  • ثم ينام النص لمدة 60 ثانية.
  • بعد 60 ثانية تتكرر الحلقة. لذلك ، يكتب هذا النص رسالة ذات طابع زمني إلى المجلة مرة واحدة في الدقيقة.

سنقوم بنسخ البرنامج النصي إلى دليل /usr/local/bin .

 sudo cp htg.sh / usr / local / bin 

ونحتاج إلى جعله قابلاً للتنفيذ:

 sudo chmod + x /usr/local/bin/htg.sh 

إنشاء ملف وحدة الخدمة

يحتوي كل برنامج يتم تشغيله بواسطة systemd على ملف تعريف يسمى ملف وحدة الخدمة. يحمل هذا سمات معينة يمكن أن يستخدمها systemd لتحديد موقع البرنامج وتشغيله ، وتحديد بعض سلوكه.

نحتاج إلى إنشاء ملف وحدة لخدمتنا الجديدة ، ولكن من الحكمة التأكد من عدم وجود أي من ملفات الوحدة الحالية بالاسم الذي نريد تقديمه لخدمتنا الجديدة.

 sudo systemctl list-unit-files - type-service 

يمكنك التمرير خلال قائمة ملفات الوحدة ، والتي تم فرزها أبجديًا ، والتحقق من عدم استخدام الاسم الذي تريد استخدامه.

الإعلانات

ستطلق على خدمتنا اسم "htg.service". لا توجد ملفات وحدة بهذا الاسم ، لذا يمكننا المتابعة وإنشاء ملف الوحدة الخاص بنا.

 sudo gedit /etc/systemd/system/htg.service 

سيتم فتح محرر gedit . انسخ والصق النص التالي في المحرر:

 [وحدة]
الوصف = مثال خدمة How-To Geek

يريد = network.target
بعد = syslog.target network-online.target

[خدمة]
اكتب = بسيط
ExecStart = / usr / local / bin / htg.sh
إعادة التشغيل = عند الفشل
RestartSec = 10
KillMode = عملية

[تثبيت]
WantedBy = multi-user.target

احفظ التغييرات وأغلق المحرر.

htg.service في محرر gedit

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

  • الوصف: هذا وصف نصي لخدمتك.
  • يريد: تريد خدمتنا - ولكنها لا تتطلب - أن تكون الشبكة جاهزة قبل بدء خدمتنا.
  • بعد: قائمة بأسماء الوحدات التي يجب أن تبدأ بعد بدء هذه الخدمة بنجاح ، إذا لم تكن قيد التشغيل بالفعل.
  • النوع: بسيط. سوف يعتبر systemd أن هذه الخدمة قد بدأت بمجرد أن يتم تفرع العملية المحددة من قبل ExecStart .
  • ExecStart: المسار إلى العملية التي يجب أن تبدأ.
  • إعادة التشغيل: متى وما إذا كان يجب إعادة تشغيل الخدمة. لقد وضعناها على "عند الفشل".
  • RestartSec: ما هي مدة الانتظار قبل محاولة إعادة تشغيل الخدمة. هذه القيمة بالثواني.
  • KillMode: يحدد كيف يجب أن يقتل systemd العملية إذا طلبنا من systemctl إيقاف الخدمة. لدينا هذه المجموعة "العملية". هذا يجعل systemd يستخدم إشارة SIGTERM في العملية الرئيسية فقط. إذا كانت خدمتنا برنامجًا غير تافه بدلاً من برنامج نصي بسيط ، فسنقوم بتعيين هذا على "مختلط" لضمان إنهاء أي عمليات منتجة أيضًا.
  • WantedBy: لقد قمنا بتعيين هذا على "multi-user.target" ، مما يعني أن الخدمة يجب أن تبدأ طالما أن النظام في حالة يمكن لعدة مستخدمين تسجيل الدخول إليها ، سواء كانت واجهة مستخدم رسومية متاحة أم لا.

لا يلزم أن يكون ملف الوحدة قابلاً للتنفيذ ، لكن الأذونات في ملف الوحدة يجب أن تقيد من يمكنه تحريره. لا تريد أن يقوم مستخدم ضار أو مؤذ بتغيير ملف الوحدة بحيث ينفذ برنامجًا مختلفًا تمامًا.

سيعطي هذا الأمر المالك أذونات القراءة والكتابة ، وقراءة الأذونات للمجموعة. لن يكون لدى الآخرين أي أذونات.

 sudo chmod 640 /etc/systemd/system/htg.service 

يمكننا أن systemctl يتحقق من بناء جملة ملف الوحدة لدينا ، حتى لو لم تكن الخدمة قيد التشغيل بعد. سيتم الإبلاغ عن أي أخطاء. (في الواقع ، يعد جزء "الخدمة" اختياريًا لمعظم الأوامر.)

 systemctl status htg.service 

الإعلانات

لم يتم تمييز أي أخطاء ، مما يعني أن ملف وحدتنا صحيح من الناحية التركيبية.

بدء الخدمة

عند إضافة ملف وحدة جديد أو تحرير ملف موجود ، يجب أن تخبر systemd بإعادة تحميل تعريفات ملف الوحدة.

 sudo systemctl الخفي إعادة تحميل

إذا كنت تريد إطلاق خدمة عند بدء التشغيل ، فيجب عليك تمكينها :

 sudo systemctl تمكين htg

لا يؤدي تمكين الخدمة إلى بدء تشغيلها ، بل يعيِّنها فقط ليتم تشغيلها في وقت التمهيد. لبدء الخدمة الآن ، يجب عليك استخدام systemctl مع خيار start .

 sudo systemctl ابدأ htg 

التحقق من الخدمة

بعد بدء الخدمة يدويًا أو بعد إعادة تشغيل الكمبيوتر ، يمكننا التحقق من أن خدمتنا تعمل بشكل صحيح.

 sudo systemctl الحالة htg.service 

يتم عرض حالة الخدمة بالنسبة لنا.

حالة خدمة htg في أداة طرفية الآن

  • تعني النقطة الخضراء أن خدمتنا تعمل بسلاسة.
  • اسم الخدمة "htg.service" ، والوصف الطويل هو الاسم الذي قدمناه في ملف الوحدة.
  • لقد أظهرنا ملف الوحدة الذي تم تحميله "/etc/systemd/system/htg.service".
  • الخدمة نشطة ، والوقت الذي تم إطلاق الخدمة فيه مدرج بالنسبة لنا.
  • معرف المنتج هو 7762.
  • هناك نوعان من المهام المرتبطة بالخدمة.
  • يتم استخدام إجمالي 928 كيبي بايت من الذاكرة بواسطة الخدمة.
  • تتضمن مجموعة التحكم البرنامج النصي "htg.sh" وأمر sleep الذي تم تشغيله بواسطة "htg.sh." في معظم الأوقات ، سيقوم أمر sleep بالعمل لهذه الخدمة.

تم أيضًا عرض آخر 10 إدخالات يومية أنتجتها هذه الخدمة. مما لا يثير الدهشة ، أنهم جميعًا يفصلون دقيقة واحدة.

ايقاف وتعطيل الخدمة

إذا كنت بحاجة إلى إيقاف الخدمة ، فيمكنك القيام بذلك باستخدام هذا الأمر:

 sudo systemctl توقف htg.service 

الإعلانات

يؤدي هذا إلى إيقاف الخدمة ، لكنه لا يمنعها من إعادة التشغيل في المرة التالية التي يتم فيها إعادة تشغيل الكمبيوتر. لإيقاف تشغيل الخدمة عند بدء التشغيل ، تحتاج إلى تعطيلها :

 sudo systemctl تعطيل htg.service 

إذا كانت الخدمة قيد التشغيل ، فإن هذا الأمر لا يوقفها. إنه ببساطة يخبر systemd بعدم تشغيل الخدمة عند إعادة التشغيل التالية.

إذا كنت تريد إيقاف الخدمة ومنعها من التشغيل عند بدء التشغيل ، فاستخدم كلا الأمرين.

نصيحة الخدمة

تأكد من تشغيل برنامجك بالشكل المتوقع قبل محاولة تشغيله كخدمة.

ذات صلة: أفضل أجهزة كمبيوتر Linux المحمولة للمطورين والمتحمسين