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

النقاط الرئيسية

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



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


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

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


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

البرامج التي تعمل في الخلفية تسمى الشياطين أو الخدمات. الحرف “d” في نهاية systemd تعني كلمة daemon (شيطان). في هذه المقالة، سننشئ خدمة نموذجية. لكي تتحقق جميع الشروط، يجب أن تكون خدمتنا:

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

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


إنشاء برنامج الخدمة لبدء تشغيل systemd

نحن بحاجة إلى أن يكون لدينا برنامج systemd سيتم التشغيل. سنقوم بإنشاء نص برمجي بسيط يسمى “htg.sh”. يستخدم هذا البرنامج التعليمي محرر النصوص Gedit، ولكن يمكنك استخدام أي محرر نصوص تفضله.

touch htg.sh

gedit htg.sh

المس htg.sh في نافذة المحطة الطرفية

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

#!/bin/bashecho "htg.service: ## Starting ##" | systemd-cat -p infowhile :doTIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p infosleep 60done

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

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


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

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

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

sudo cp htg.sh /usr/local/bin


sudo cp htg.sh /usr/local/bin في نافذة المحطة الطرفية

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

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

sudo chmod +x /usr/local/bin/htg.sh في نافذة المحطة الطرفية

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

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

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

sudo systemctl list-unit-files --type-service


sudo systemctl list-unit-files --type-service في نافذة المحطة الطرفية

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

قائمة ملفات وحدة systemd في نافذة المحطة الطرفية

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

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

sudo gedit /etc/systemd/system/htg.service في نافذة المحطة الطرفية


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

(Unit)Description=How-To Geek Service ExampleWants=network.targetAfter=syslog.target network-online.target(Service)Type=simpleExecStart=/usr/local/bin/htg.shRestart=on-failureRestartSec=10KillMode=process(Install)WantedBy=multi-user.target

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

ملف وحدة htg.service في محرر gedit

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


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


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

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

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

sudo chmod 640 /etc/systemd/system/htg.service في نافذة المحطة الطرفية

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

systemctl status htg.service


حالة systemctl htg.service في نافذة المحطة الطرفية

لم يتم تسليط الضوء على أي أخطاء، مما يعني أن ملف الوحدة الخاص بنا صحيح من الناحية النحوية.

بدء تشغيل الخدمة تلقائيًا باستخدام الأمر systemd

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

sudo systemctl daemon-reload

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

sudo systemctl enable htg

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

sudo systemctl start htg

sudo systemctl daemon-reload في نافذة المحطة الطرفية


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

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

sudo systemctl status htg.service

sudo systemctl status htg.service في نافذة المحطة الطرفية

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

حالة htg.service في محطة طرفية


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

كما نعرض لك أيضًا آخر 10 إدخالات يومية أنتجتها هذه الخدمة. ومن غير المستغرب أن تكون جميعها متباعدة بفارق دقيقة واحدة.

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

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

sudo systemctl stop htg.service

sudo systemctl stop htg.service في نافذة المحطة الطرفية


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

sudo systemctl disable htg.service

sudo systemtctl تعطيل خدمة htg في نافذة المحطة الطرفية

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

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

نصيحة الخدمة

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


أضف تعليق