EQVPS

كيف تُنشئ خدمة systemd لإبقاء تطبيق قيد التشغيل

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

تشغيل تطبيق بـ & أو nohup جيد حتى يُعاد إقلاع الخادم، أو تتعطّل العملية، أو تريد إيجاد سجلّاتها — عندها ينهار. systemd هو الجواب القياسي: يبدأ تطبيقك عند الإقلاع، ويعيد تشغيله إن مات، ويلتقط سجلّاته. تحويل سكربت أو ثنائي إلى خدمة مُدارة هو ملف صغير واحد.

1. اكتب ملف وحدة

أنشئ /etc/systemd/system/myapp.service:

[Unit]
Description=My application
After=network.target

[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/run.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

اضبط ExecStart وWorkingDirectory وUser بما يلائم تطبيقك. Restart=always هو ما يُبقيه حيًّا.

2. أنشئ مستخدمًا مخصصًا (مُوصى به)

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo chown -R myapp:myapp /opt/myapp

التشغيل كمستخدم غير جذري يحدّ من الضرر إن اختُرق التطبيق يومًا.

3. فعّله وابدأه

sudo systemctl daemon-reload
sudo systemctl enable --now myapp

enable يجعله يبدأ عند الإقلاع؛ و--now يبدأه فورًا.

4. تحقّق من الحالة والسجلّات

sudo systemctl status myapp
journalctl -u myapp -f       # متابعة السجلّات الحية

أوامر يومية

sudo systemctl restart myapp   # إعادة التشغيل بعد تغيير
sudo systemctl stop myapp      # أوقفه
sudo systemctl disable myapp   # أوقف بدأه عند الإقلاع

تحذيرات صادقة

الخطوات التالية

خدمة systemd هي كيف تُبقي أي شيء يعمل على مدار الساعة — مثلًا وكيل ذكاء اصطناعي يعمل على مدار الساعة أو المُرحِّل خلف خادم RustDesk مُستضاف ذاتيًا. إن كان تطبيقك في حاوية بدلاً من ذلك، يؤدي --restart unless-stopped في Docker الدور نفسه — راجع كيف تثبّت Docker.

الأسئلة الشائعة

لماذا أستخدم systemd بدلاً من مجرد تشغيل التطبيق في الخلفية؟

العملية في الخلفية (بـ & أو nohup) تموت عند إعادة الإقلاع، ولا تعود إن تعطّلت، وتبعثر سجلّاتها. خدمة systemd تبدأ تلقائيًا عند الإقلاع، وتعيد التشغيل عند الفشل، وترسل مخرجاتها إلى journalctl. إنها الطريقة القياسية الموثوقة لتشغيل شيء طويل الأمد على Linux.

أين تُوضع ملفات الوحدة؟

خدماتك الخاصة تُوضع في /etc/systemd/system/، ملف لكل خدمة، باسم مثل something.service. بعد إنشاء أو تحرير واحد، شغّل 'systemctl daemon-reload' كي يلتقط systemd التغيير، ثم فعّله وابدأه.

ماذا يفعل 'Restart=always'، وهل له سلبيات؟

يخبر systemd بإعادة تشغيل الخدمة كلما خرجت، لأي سبب — وهو مفتاح إبقاء شيء قيد التشغيل. المأزق الوحيد هو حلقة الأعطال: إن فشل التطبيق فورًا عند البدء، يواصل systemd إعادة تشغيله. أضف 'RestartSec=5' لتباعد المحاولات، وراجع السجلّات لإصلاح الخطأ الأساسي.

كيف أرى سجلّات الخدمة؟

استخدم 'journalctl -u yourservice -f' لمتابعة المخرجات الحية، أو دون -f لقراءة التاريخ. يلتقط systemd stdout وstderr تلقائيًا، فلا تحتاج إلى توصيل ملفات سجلّ بنفسك.

هل ينبغي أن تعمل الخدمة كـ root؟

يُفضّل لا. أنشئ مستخدمًا مخصصًا غير جذري واضبط 'User=' في الوحدة، كي لا يُسلّم اختراق التطبيق الجهاز كله. شغّلها كـ root فقط عندما تحتاج الخدمة ذلك فعلاً.

التعليقات

لا تعليقات بعد. كن الأول.

اترك تعليقًا

تُراجَع التعليقات قبل ظهورها.