النقاط الرئيسية
- 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
ال 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
احفظ التغييرات وأغلق المحرر.
لا يقدم النص الكثير، ولكن هناك بعض النقاط التي تستحق الملاحظة.
- الاثنان
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
سيتم فتح المحرر. انسخ النص التالي والصقه في المحرر:
(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
احفظ التغييرات وأغلق المحرر.
تحتوي الإدخالات على هذه المعاني. هذه إدخالات نموذجية. لا تحتاج خدمتنا البسيطة في الواقع إلى معظمها، لكن تضمينها يسمح لنا بشرحها.
- وصف: هذا وصف نصي لخدمتك.
- يريد: تريد خدمتنا — ولكنها لا تشترط — أن تكون الشبكة جاهزة قبل بدء خدمتنا.
- بعد: قائمة بأسماء الوحدات التي ينبغي تشغيلها بعد بدء هذه الخدمة بنجاح، إذا لم تكن قيد التشغيل بالفعل.
- يكتب: بسيط.
systemd
سيتم اعتبار هذه الخدمة قد بدأت بمجرد انتهاء العملية المحددة بواسطةExecStart
لقد تم تقسيمها. - بدء التشغيل: المسار إلى العملية التي ينبغي البدء بها.
- إعادة تشغيل: متى وإذا كان ينبغي إعادة تشغيل الخدمة. لقد قمنا بتعيينها على “عند الفشل”.
- إعادة تشغيل ثانية: المدة التي يجب الانتظارها قبل محاولة إعادة تشغيل الخدمة. هذه القيمة بالثواني.
- وضع القتل: يحدد كيف
systemd
يجب أن نقتل العملية إذا طلبنا ذلكsystemctl
لإيقاف الخدمة. لقد قمنا بتعيين هذا على “المعالجة”. وهذا يتسبب فيsystemd
لاستخدامSIGTERM
الإشارة على العملية الرئيسية فقط. إذا كانت خدمتنا عبارة عن برنامج غير تافه بدلاً من نص برمجي بسيط، فسنقوم بتعيين هذا على “مختلط” لضمان إنهاء أي عمليات تم إنشاؤها أيضًا. - مطلوب بواسطة: لقد قمنا بتعيين هذا على “multi-user.target”، مما يعني أنه يجب بدء تشغيل الخدمة طالما كان النظام في حالة تسمح لمستخدمين متعددين بتسجيل الدخول، سواء كانت واجهة المستخدم الرسومية متوفرة أم لا.
لا يلزم أن يكون ملف الوحدة قابلاً للتنفيذ، ولكن الأذونات على ملف الوحدة يجب أن تقيد من يمكنه تحريره. لا تريد أن يقوم مستخدم ضار أو مؤذٍ بتغيير ملف الوحدة بحيث ينفذ برنامجًا مختلفًا تمامًا.
سيمنح هذا الأمر المالك أذونات القراءة والكتابة وأذونات القراءة للمجموعة. ولن يحصل الآخرون على أي أذونات.
sudo chmod 640 /etc/systemd/system/htg.service
يمكننا أن نمتلك systemctl
تحقق من بناء جملة ملف الوحدة الخاص بنا، حتى لو لم تكن الخدمة قيد التشغيل بعد. سيتم الإبلاغ عن أي أخطاء. (في الواقع، يعد جزء “.service” اختياريًا لمعظم الأوامر.)
systemctl status htg.service
لم يتم تسليط الضوء على أي أخطاء، مما يعني أن ملف الوحدة الخاص بنا صحيح من الناحية النحوية.
بدء تشغيل الخدمة تلقائيًا باستخدام الأمر systemd
عند إضافة ملف وحدة جديد أو تعديل ملف موجود، يجب عليك إخبار systemd
لإعادة تحميل تعريفات ملف الوحدة.
sudo systemctl daemon-reload
إذا كنت تريد تشغيل الخدمة عند بدء التشغيل، فيجب عليك تمكينها:
sudo systemctl enable htg
لا يؤدي تمكين الخدمة إلى تشغيلها، بل إنه فقط يضبطها ليتم تشغيلها عند وقت التمهيد. لبدء الخدمة الآن، يجب عليك استخدام systemctl
مع start
خيار.
sudo systemctl start htg
التحقق من الخدمة
بعد بدء الخدمة يدويًا أو بعد إعادة تشغيل الكمبيوتر، يمكننا التأكد من تشغيل خدمتنا بشكل صحيح.
sudo systemctl status 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 disable htg.service
إذا كانت الخدمة قيد التشغيل، فإن هذا الأمر لا يوقفها. بل يخبرك ببساطة systemd
عدم تشغيل الخدمة عند إعادة التشغيل التالية.
إذا كنت تريد إيقاف الخدمة ومنع تشغيلها عند بدء التشغيل، فاستخدم كلا الأمرين.
نصيحة الخدمة
تأكد من تشغيل برنامجك كما هو متوقع قبل محاولة تشغيله كخدمة.